splent-cli 1.51.0__tar.gz → 1.53.0__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.
- {splent_cli-1.51.0/src/splent_cli.egg-info → splent_cli-1.53.0}/PKG-INFO +1 -1
- {splent_cli-1.51.0 → splent_cli-1.53.0}/pyproject.toml +1 -1
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_release.py +11 -12
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/release/release_resume.py +15 -1
- splent_cli-1.53.0/src/splent_cli/services/release_workspace.py +223 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/SOURCES.txt +1 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/COPYING +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/COPYING.LESSER +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/README.md +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/setup.cfg +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/__main__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/cli.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_deps.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_docker.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_env.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_features.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_github.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_infra.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_product.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_releases.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_vendor.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/clear_uploads.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/command/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/command/command_create.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/coverage.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_console.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_dump.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_reset.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_restore.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_rollback.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_seed.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_status.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_upgrade.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/doctor.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/env/env_list.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/env/env_set.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/env/env_show.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/export/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/export/export_puml.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_frontend_init.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_npm.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_release.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_rename.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_security.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_test.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/lint.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/locust.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/login.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_build.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_clean.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_commands.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_config.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_configure.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_console.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_containers.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_create.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_derive.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_down.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_drift.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_env.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_frontend_audit.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_list.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_logs.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_missing.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_params.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_port.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_restart.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_routes.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_run.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_select.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_shell.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_signals.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_test.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_up.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_validate.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/release/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/release/release_core.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/selenium.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_publish.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/storage/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/storage/storage_migrate.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/tokens_setup.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/uvl/uvl_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/version.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/compose.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/context.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/credentials.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/deploy_bundle.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/editable_refresh.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/frontend.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/image_registry.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/index_refresh.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/marketplace.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/marketplace_api.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/marketplace_url.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/neutral_app.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/own_commands.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/preflight.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/pypi_quota.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/registry.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/release.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/release_dry_run.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/release_gate.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/security_scan.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/source_mirror.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/spl_store.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/web_container.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_.gitignore.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_MANIFEST.in.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_README.md.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_commands.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_config.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_docker-compose.dev.yml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_docker-compose.prod.yml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_docker.env.example.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_forms.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_frontend.npmrc.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_frontend_scripts.js.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_hooks.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init_config.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init_light.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init_service.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_migrations_alembic.ini.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_migrations_env.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_migrations_script.py.mako.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_models.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_pyproject.toml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_pyproject_minimal.toml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_repositories.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_routes.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_scripts.js.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_seeders.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_services.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_services_service.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_signals.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_templates_index.html.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_conftest.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_e2e.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_functional.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_integration.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_locustfile.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_unit.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_webpack.config.js.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/licenses/COPYING +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/licenses/COPYING.LESSER +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_.env.dev.example.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_.env.prod.example.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_.gitignore.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_00_core_requirements_dev.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_00_install_features.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_01_compile_assets.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_02_0_db_wait_connection.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_02_1_db_create_db_test.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_02_2_db_create_splent_migrations.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_03_initialize_migrations.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_04_handle_migrations.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_05_0_start_app_dev.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_05_1_start_app_prod.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_400.html +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_401.html +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_404.html +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_500.html +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.dev.dockerignore.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.dev.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.prod.dockerignore.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.prod.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_README.md.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_app.css +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_app.js +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_base_template.html +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_ci_upgrade.yml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_ci_validate.yml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_config.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_docker-compose.dev.yml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_docker-compose.prod.yml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_dropzone.css +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_entrypoint.dev.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_entrypoint.prod.sh.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_errors.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_favicon.svg +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_init.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_logging.py.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_own.css +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_package.json.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_pyproject.toml.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_uvl.j2 +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/Dockerfile.frontend +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/package-lock.json +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/package.json +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/build.js +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/legacy.js +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/lint.js +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/plugin.js +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/preset.js +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/singletons.json +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/__init__.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/archetype.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/cache_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/ci_services.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/ci_workflow.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/command_loader.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/contract_freshness.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/db_client.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/db_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/decorators.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/deploy_freshness.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/dynamic_imports.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_installer.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_naming.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_params.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_requirements.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_resolution.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/forge.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/frontend_check.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/frontend_licenses.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/git_url.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/integrity.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/io_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/lifecycle.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/manifest.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/menu_keys.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/migration_lock.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/npm_semver.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/path_utils.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/proc.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/redact.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/refinement_facts.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/running_version.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/template_drift.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/toml_edit.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/uvl_diagnosis.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/uvl_params.py +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/requires.txt +0 -0
- {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/top_level.txt +0 -0
|
@@ -6,6 +6,7 @@ import contextlib
|
|
|
6
6
|
import json
|
|
7
7
|
import os
|
|
8
8
|
import subprocess
|
|
9
|
+
import sys
|
|
9
10
|
import tempfile
|
|
10
11
|
|
|
11
12
|
import click
|
|
@@ -28,6 +29,7 @@ from splent_cli.services import (
|
|
|
28
29
|
image_registry,
|
|
29
30
|
release,
|
|
30
31
|
release_gate,
|
|
32
|
+
release_workspace,
|
|
31
33
|
source_mirror,
|
|
32
34
|
)
|
|
33
35
|
from splent_cli.utils.proc import run, require_docker
|
|
@@ -40,19 +42,9 @@ def _guard_all_features_pinned(product_path: str):
|
|
|
40
42
|
features_prod declare, so an editable entry in any of them makes the
|
|
41
43
|
release irreproducible, not only one in the base list.
|
|
42
44
|
"""
|
|
43
|
-
from splent_cli.utils.feature_utils import
|
|
44
|
-
FEATURE_LIST_KEYS,
|
|
45
|
-
load_product_pyproject,
|
|
46
|
-
read_feature_list,
|
|
47
|
-
)
|
|
45
|
+
from splent_cli.utils.feature_utils import load_product_pyproject
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
editable = [
|
|
51
|
-
(key, entry)
|
|
52
|
-
for key in FEATURE_LIST_KEYS
|
|
53
|
-
for entry in read_feature_list(data, key)
|
|
54
|
-
if "@" not in entry
|
|
55
|
-
]
|
|
47
|
+
editable = release_workspace.editable_features(load_product_pyproject(product_path))
|
|
56
48
|
if not editable:
|
|
57
49
|
return
|
|
58
50
|
|
|
@@ -427,6 +419,13 @@ def product_release(
|
|
|
427
419
|
click.secho(f" error: pyproject.toml not found in {product}", fg="red")
|
|
428
420
|
raise SystemExit(1)
|
|
429
421
|
|
|
422
|
+
if release_workspace.in_development_mode(product_path):
|
|
423
|
+
raise SystemExit(
|
|
424
|
+
release_workspace.run_from_head(
|
|
425
|
+
product, product_path, str(context.workspace()), sys.argv[1:]
|
|
426
|
+
)
|
|
427
|
+
)
|
|
428
|
+
|
|
430
429
|
_guard_all_features_pinned(product_path)
|
|
431
430
|
_guard_deployable(str(context.workspace()), product, product_path)
|
|
432
431
|
mirror = None if no_mirror else _declared_source_mirror(product_path)
|
|
@@ -33,11 +33,18 @@ import contextlib
|
|
|
33
33
|
import os
|
|
34
34
|
import shutil
|
|
35
35
|
import subprocess
|
|
36
|
+
import sys
|
|
36
37
|
import tempfile
|
|
37
38
|
|
|
38
39
|
import click
|
|
39
40
|
|
|
40
|
-
from splent_cli.services import
|
|
41
|
+
from splent_cli.services import (
|
|
42
|
+
context,
|
|
43
|
+
release,
|
|
44
|
+
release_gate,
|
|
45
|
+
release_workspace,
|
|
46
|
+
source_mirror,
|
|
47
|
+
)
|
|
41
48
|
from splent_cli.utils import forge
|
|
42
49
|
from splent_cli.utils.git_url import _non_interactive_env
|
|
43
50
|
|
|
@@ -322,6 +329,13 @@ def release_resume(target, assume_yes, no_pypi, no_forge, no_github, no_docker,
|
|
|
322
329
|
no_forge = release.no_forge_requested(no_forge, no_github)
|
|
323
330
|
workspace = str(context.workspace())
|
|
324
331
|
path, label, kind = resolve_target(target, workspace)
|
|
332
|
+
if kind == "product" and release_workspace.in_development_mode(path):
|
|
333
|
+
raise SystemExit(
|
|
334
|
+
release_workspace.run_from_head(
|
|
335
|
+
os.path.basename(path), path, workspace, sys.argv[1:]
|
|
336
|
+
)
|
|
337
|
+
)
|
|
338
|
+
|
|
325
339
|
# What the hints this run prints tell the operator to run next. A withheld
|
|
326
340
|
# image stays withheld.
|
|
327
341
|
hint_target = f"{target} --no-docker" if no_docker else target
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""Releasing what HEAD holds while the checkout is in development mode.
|
|
2
|
+
|
|
3
|
+
A product under development lists its features without a version in
|
|
4
|
+
pyproject.toml, uncommitted, so the app mounts their working copies. HEAD keeps
|
|
5
|
+
them pinned. Such a checkout cannot release as it is, and it should not have to
|
|
6
|
+
change either: a release is what is committed.
|
|
7
|
+
|
|
8
|
+
So product:release and release:resume run from a temporary workspace of their
|
|
9
|
+
own, a worktree of HEAD next to the cache and the product line's model, and the
|
|
10
|
+
checkout moves forward afterwards with its pyproject.toml as it was, bar what
|
|
11
|
+
the release changed in it.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import glob
|
|
17
|
+
import os
|
|
18
|
+
import shutil
|
|
19
|
+
import subprocess
|
|
20
|
+
import sys
|
|
21
|
+
import tempfile
|
|
22
|
+
import tomllib
|
|
23
|
+
|
|
24
|
+
import click
|
|
25
|
+
|
|
26
|
+
from splent_cli.utils.feature_utils import (
|
|
27
|
+
FEATURE_LIST_KEYS,
|
|
28
|
+
load_product_pyproject,
|
|
29
|
+
read_feature_list,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
PYPROJECT = "pyproject.toml"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def editable_features(data: dict) -> list[tuple[str, str]]:
|
|
36
|
+
"""``(list, entry)`` of every feature of a pyproject with no version pinned.
|
|
37
|
+
|
|
38
|
+
Every list counts. A release runs whatever features, features_dev and
|
|
39
|
+
features_prod declare.
|
|
40
|
+
"""
|
|
41
|
+
return [
|
|
42
|
+
(key, entry)
|
|
43
|
+
for key in FEATURE_LIST_KEYS
|
|
44
|
+
for entry in read_feature_list(data, key)
|
|
45
|
+
if "@" not in entry
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _git(path: str, *args: str) -> subprocess.CompletedProcess:
|
|
50
|
+
return subprocess.run(["git", *args], cwd=path, capture_output=True, text=True)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def in_development_mode(product_path: str) -> bool:
|
|
54
|
+
"""Whether the checkout has editable features and HEAD has none."""
|
|
55
|
+
if not editable_features(load_product_pyproject(product_path)):
|
|
56
|
+
return False
|
|
57
|
+
head = _git(product_path, "show", f"HEAD:{PYPROJECT}")
|
|
58
|
+
if head.returncode != 0:
|
|
59
|
+
return False
|
|
60
|
+
try:
|
|
61
|
+
return not editable_features(tomllib.loads(head.stdout))
|
|
62
|
+
except tomllib.TOMLDecodeError:
|
|
63
|
+
return False
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _only_in_checkout(work: dict, head: dict, path: str = "") -> list[str]:
|
|
67
|
+
"""What the checkout's pyproject.toml says that HEAD does not, pins aside."""
|
|
68
|
+
found = []
|
|
69
|
+
for key, value in work.items():
|
|
70
|
+
where = f"{path}.{key}" if path else key
|
|
71
|
+
if path == "tool.splent" and key in FEATURE_LIST_KEYS:
|
|
72
|
+
continue
|
|
73
|
+
if key not in head:
|
|
74
|
+
found.append(where)
|
|
75
|
+
elif isinstance(value, dict) and isinstance(head[key], dict):
|
|
76
|
+
found.extend(_only_in_checkout(value, head[key], where))
|
|
77
|
+
elif value != head[key]:
|
|
78
|
+
found.append(where)
|
|
79
|
+
return found
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def settings_left_out(product_path: str) -> list[str]:
|
|
83
|
+
"""The settings of the checkout's pyproject.toml this release will not carry.
|
|
84
|
+
|
|
85
|
+
The feature lists are what development mode changes on purpose. Anything
|
|
86
|
+
else there holds in development and not in production, without a word:
|
|
87
|
+
that is how a product kept serving a page its pyproject.toml turned off.
|
|
88
|
+
"""
|
|
89
|
+
head = _git(product_path, "show", f"HEAD:{PYPROJECT}")
|
|
90
|
+
try:
|
|
91
|
+
return _only_in_checkout(
|
|
92
|
+
load_product_pyproject(product_path), tomllib.loads(head.stdout)
|
|
93
|
+
)
|
|
94
|
+
except tomllib.TOMLDecodeError:
|
|
95
|
+
return []
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _splent(args: list[str], env: dict) -> int:
|
|
99
|
+
"""Run the CLI in the temporary workspace, in this terminal."""
|
|
100
|
+
return subprocess.run(
|
|
101
|
+
[sys.executable, "-m", "splent_cli", *args], env=env
|
|
102
|
+
).returncode
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _merged_pyproject(path: str, ours: str, base: str, theirs: str) -> str | None:
|
|
106
|
+
"""Three-way merge of the checkout's pyproject.toml, None on a conflict."""
|
|
107
|
+
with tempfile.TemporaryDirectory(prefix="splent_pyproject_") as tmp:
|
|
108
|
+
names = []
|
|
109
|
+
for name, content in (("ours", ours), ("base", base), ("theirs", theirs)):
|
|
110
|
+
names.append(os.path.join(tmp, name))
|
|
111
|
+
with open(names[-1], "w", encoding="utf-8") as f:
|
|
112
|
+
f.write(content)
|
|
113
|
+
merged = _git(path, "merge-file", "-p", *names)
|
|
114
|
+
return merged.stdout if merged.returncode == 0 else None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _bring_checkout_forward(product_path: str, start: str, end: str) -> None:
|
|
118
|
+
"""Move the checkout to *end*, its development pyproject.toml kept.
|
|
119
|
+
|
|
120
|
+
Says so when it cannot, and leaves the checkout exactly as it found it.
|
|
121
|
+
"""
|
|
122
|
+
hint = f"Your checkout stays where it was. When it can, run git merge --ff-only {end[:12]}."
|
|
123
|
+
if _git(product_path, "rev-parse", "HEAD").stdout.strip() != start:
|
|
124
|
+
click.secho(f" checkout HEAD moved during the release. {hint}", fg="yellow")
|
|
125
|
+
return
|
|
126
|
+
pyproject = os.path.join(product_path, PYPROJECT)
|
|
127
|
+
with open(pyproject, encoding="utf-8") as f:
|
|
128
|
+
ours = f.read()
|
|
129
|
+
merged = _merged_pyproject(
|
|
130
|
+
product_path,
|
|
131
|
+
ours,
|
|
132
|
+
_git(product_path, "show", f"{start}:{PYPROJECT}").stdout,
|
|
133
|
+
_git(product_path, "show", f"{end}:{PYPROJECT}").stdout,
|
|
134
|
+
)
|
|
135
|
+
if merged is None:
|
|
136
|
+
click.secho(
|
|
137
|
+
f" checkout your {PYPROJECT} and the release's do not merge. {hint}",
|
|
138
|
+
fg="yellow",
|
|
139
|
+
)
|
|
140
|
+
return
|
|
141
|
+
|
|
142
|
+
result = merged
|
|
143
|
+
moved = False
|
|
144
|
+
try:
|
|
145
|
+
_git(product_path, "checkout", "--", PYPROJECT)
|
|
146
|
+
forward = _git(product_path, "merge", "--ff-only", "--quiet", end)
|
|
147
|
+
moved = forward.returncode == 0
|
|
148
|
+
if not moved:
|
|
149
|
+
result = ours
|
|
150
|
+
click.secho(
|
|
151
|
+
f" checkout {forward.stderr.strip()}\n checkout {hint}", fg="yellow"
|
|
152
|
+
)
|
|
153
|
+
except OSError as e:
|
|
154
|
+
result = ours
|
|
155
|
+
click.secho(f" checkout {e}. {hint}", fg="yellow")
|
|
156
|
+
finally:
|
|
157
|
+
with open(pyproject, "w", encoding="utf-8") as f:
|
|
158
|
+
f.write(result)
|
|
159
|
+
if moved:
|
|
160
|
+
click.echo(f" checkout now at {end[:12]}, your {PYPROJECT} is kept")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def run_from_head(
|
|
164
|
+
product: str, product_path: str, workspace: str, argv: list[str]
|
|
165
|
+
) -> int:
|
|
166
|
+
"""Run this command in a temporary workspace holding HEAD. Its exit code.
|
|
167
|
+
|
|
168
|
+
The checkout ends where a release run in it would have, commit included
|
|
169
|
+
when the command stopped halfway, so release:resume can go on from it.
|
|
170
|
+
"""
|
|
171
|
+
start = _git(product_path, "rev-parse", "HEAD").stdout.strip()
|
|
172
|
+
click.secho(
|
|
173
|
+
f" checkout {product} has editable features, so this works from what HEAD "
|
|
174
|
+
f"holds ({start[:12]}).",
|
|
175
|
+
fg="cyan",
|
|
176
|
+
)
|
|
177
|
+
status = _git(product_path, "status", "--porcelain").stdout.splitlines()
|
|
178
|
+
left_out = [line[3:] for line in status if line[3:] != PYPROJECT]
|
|
179
|
+
if left_out:
|
|
180
|
+
click.secho(
|
|
181
|
+
" checkout uncommitted, so left out: "
|
|
182
|
+
+ ", ".join(left_out[:5])
|
|
183
|
+
+ (" ..." if len(left_out) > 5 else ""),
|
|
184
|
+
fg="yellow",
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
settings = settings_left_out(product_path)
|
|
188
|
+
if settings:
|
|
189
|
+
click.secho(
|
|
190
|
+
f" WARNING your {PYPROJECT} has settings HEAD does not, so this version "
|
|
191
|
+
"goes without them. Commit them if production needs them:",
|
|
192
|
+
fg="yellow",
|
|
193
|
+
bold=True,
|
|
194
|
+
)
|
|
195
|
+
for setting in settings:
|
|
196
|
+
click.secho(f" {setting}", fg="yellow")
|
|
197
|
+
|
|
198
|
+
temporary = tempfile.mkdtemp(prefix="splent_release_")
|
|
199
|
+
worktree = os.path.join(temporary, product)
|
|
200
|
+
try:
|
|
201
|
+
cache = os.path.join(workspace, ".splent_cache")
|
|
202
|
+
for path in [cache, *glob.glob(os.path.join(workspace, "splent_spl_*"))]:
|
|
203
|
+
if os.path.exists(path):
|
|
204
|
+
os.symlink(path, os.path.join(temporary, os.path.basename(path)))
|
|
205
|
+
added = _git(product_path, "worktree", "add", "--detach", worktree, start)
|
|
206
|
+
if added.returncode != 0:
|
|
207
|
+
click.secho(f" error: {added.stderr.strip()}", fg="red")
|
|
208
|
+
return 1
|
|
209
|
+
|
|
210
|
+
env = {**os.environ, "WORKING_DIR": temporary, "SPLENT_APP": product}
|
|
211
|
+
code = _splent(["product:resolve", "--prod", "--strict"], env)
|
|
212
|
+
if code != 0:
|
|
213
|
+
return code
|
|
214
|
+
code = _splent(argv, env)
|
|
215
|
+
|
|
216
|
+
end = _git(worktree, "rev-parse", "HEAD").stdout.strip()
|
|
217
|
+
if end and end != start:
|
|
218
|
+
_bring_checkout_forward(product_path, start, end)
|
|
219
|
+
return code
|
|
220
|
+
finally:
|
|
221
|
+
_git(product_path, "worktree", "remove", "--force", worktree)
|
|
222
|
+
_git(product_path, "worktree", "prune")
|
|
223
|
+
shutil.rmtree(temporary, ignore_errors=True)
|
|
@@ -186,6 +186,7 @@ src/splent_cli/services/registry.py
|
|
|
186
186
|
src/splent_cli/services/release.py
|
|
187
187
|
src/splent_cli/services/release_dry_run.py
|
|
188
188
|
src/splent_cli/services/release_gate.py
|
|
189
|
+
src/splent_cli/services/release_workspace.py
|
|
189
190
|
src/splent_cli/services/security_scan.py
|
|
190
191
|
src/splent_cli/services/source_mirror.py
|
|
191
192
|
src/splent_cli/services/spl_store.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_frontend_init.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_hook_remove.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_inject_config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_pip_install.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
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_sync_template.py
RENAMED
|
File without changes
|
|
File without changes
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_translate.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
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/marketplace_index.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_auto_require.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_configure.py
RENAMED
|
File without changes
|