splent-cli 1.34.0__tar.gz → 1.34.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.
- {splent_cli-1.34.0/src/splent_cli.egg-info → splent_cli-1.34.1}/PKG-INFO +1 -1
- {splent_cli-1.34.0 → splent_cli-1.34.1}/pyproject.toml +1 -1
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_create.py +2 -5
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_build.py +1 -20
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_create.py +2 -5
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/release/release_resume.py +19 -15
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/marketplace.py +2 -6
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/release.py +61 -16
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_ci_upgrade.yml.j2 +7 -1
- splent_cli-1.34.1/src/splent_cli/utils/running_version.py +28 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/template_drift.py +2 -5
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/upgrade_plan.py +3 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1/src/splent_cli.egg-info}/PKG-INFO +1 -1
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli.egg-info/SOURCES.txt +1 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/COPYING +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/COPYING.LESSER +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/README.md +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/setup.cfg +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/__main__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/cli.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_clear.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_prune.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_size.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_status.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_usage.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/cache/cache_versions.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_contracts.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_deps.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_docker.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_env.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_features.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_github.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_infra.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_product.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_pypi.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_pyproject.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/check/check_releases.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/clear/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/clear/clear_build.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/clear/clear_log.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/clear/clear_uploads.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/command/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/command/command_create.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/coverage.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_console.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_dump.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_migrate.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_reset.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_restore.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_rollback.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_seed.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_status.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/database/db_upgrade.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/doctor.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/env/env_list.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/env/env_set.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/env/env_show.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/export/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/export/export_puml.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_add.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_attach.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_clean.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_clone.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_compat.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_compile.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_contract.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_delete.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_detach.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_discard.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_drift.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_env.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_fork.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_git.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_impact.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_info.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_install.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_list.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_order.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_pin.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_pull.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_refine.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_release.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_remove.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_rename.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_search.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_status.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_test.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_translate.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_versions.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/feature/feature_xray.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/lint.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/locust.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/marketplace/login.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/marketplace/logout.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/marketplace/whoami.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_auto_require.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_clean.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_commands.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_config.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_configure.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_console.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_containers.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_deploy.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_derive.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_deselect.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_down.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_drift.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_env.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_list.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_logs.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_missing.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_port.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_release.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_resolve.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_restart.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_routes.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_run.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_select.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_shell.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_signals.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_sync_template.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_test.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_up.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/product/product_validate.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/release/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/release/release_core.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/selenium.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_compare.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_create.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_deps.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_features.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_info.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_list.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_pin.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_publish.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/spl/spl_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/tokens_setup.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/uvl/uvl_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/commands/version.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/compose.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/context.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/credentials.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/deploy_bundle.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/image_registry.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/index_refresh.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/marketplace_api.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/marketplace_url.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/preflight.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/pypi_quota.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/registry.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/release_dry_run.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/release_gate.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/services/spl_store.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_.gitignore.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_MANIFEST.in.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_README.md.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_commands.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_config.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_docker-compose.dev.yml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_docker-compose.prod.yml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_docker.env.example.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_forms.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_hooks.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_init.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_init_config.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_init_light.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_init_service.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_migrations_alembic.ini.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_migrations_env.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_migrations_script.py.mako.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_models.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_pyproject.toml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_pyproject_minimal.toml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_repositories.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_routes.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_scripts.js.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_seeders.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_services.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_signals.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_templates_index.html.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_tests_conftest.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_tests_e2e.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_tests_functional.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_tests_integration.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_tests_locustfile.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_tests_unit.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/feature/feature_webpack.config.js.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/licenses/COPYING +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/licenses/COPYING.LESSER +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_.env.dev.example.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_.env.prod.example.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_.gitignore.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_00_core_requirements_dev.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_00_install_features.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_01_compile_assets.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_02_0_db_wait_connection.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_02_1_db_create_db_test.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_02_2_db_create_splent_migrations.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_03_initialize_migrations.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_04_handle_migrations.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_05_0_start_app_dev.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_05_1_start_app_prod.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_400.html +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_401.html +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_404.html +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_500.html +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_Dockerfile.dev.dockerignore.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_Dockerfile.dev.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_Dockerfile.prod.dockerignore.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_Dockerfile.prod.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_README.md.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_app.css +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_app.js +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_base_template.html +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_ci_validate.yml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_config.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_docker-compose.dev.yml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_docker-compose.prod.yml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_dropzone.css +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_entrypoint.dev.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_entrypoint.prod.sh.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_errors.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_favicon.svg +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_init.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_logging.py.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_own.css +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_package.json.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_pyproject.toml.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_uvl.j2 +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/__init__.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/archetype.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/cache_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/command_loader.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/contract_freshness.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/db_client.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/db_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/decorators.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/dynamic_imports.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/feature_installer.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/feature_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/forge.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/git_url.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/integrity.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/io_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/lifecycle.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/manifest.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/path_utils.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/proc.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/redact.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/refinement_facts.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/utils/toml_edit.py +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli.egg-info/dependency_links.txt +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli.egg-info/entry_points.txt +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli.egg-info/requires.txt +0 -0
- {splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli.egg-info/top_level.txt +0 -0
|
@@ -10,12 +10,9 @@ from splent_cli.utils.feature_utils import (
|
|
|
10
10
|
)
|
|
11
11
|
from splent_cli.services import context
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
from importlib.metadata import version as _pkg_version
|
|
13
|
+
from splent_cli.utils.running_version import cli_version as _running_cli_version
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
except Exception:
|
|
18
|
-
_CLI_VERSION = "dev"
|
|
15
|
+
_CLI_VERSION = _running_cli_version()
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
FEATURE_TYPES = ("full", "light", "config", "service")
|
|
@@ -9,6 +9,7 @@ import click
|
|
|
9
9
|
from splent_cli.services import context, compose, deploy_bundle
|
|
10
10
|
from splent_cli.services.preflight import run_preflight
|
|
11
11
|
from splent_cli.utils.feature_utils import read_features_from_data
|
|
12
|
+
from splent_cli.utils.running_version import cli_version
|
|
12
13
|
from splent_cli.utils.io_utils import (
|
|
13
14
|
atomic_write,
|
|
14
15
|
env_line,
|
|
@@ -406,26 +407,6 @@ def framework_version(workspace: str) -> str:
|
|
|
406
407
|
)
|
|
407
408
|
|
|
408
409
|
|
|
409
|
-
def cli_version() -> str:
|
|
410
|
-
"""The version of the CLI that is running, the one the image installs too.
|
|
411
|
-
|
|
412
|
-
Read from the source tree it runs from when that is a checkout: an
|
|
413
|
-
editable install records its version once, when it is installed, and the
|
|
414
|
-
checkout moves on with every release.
|
|
415
|
-
"""
|
|
416
|
-
from importlib.metadata import version
|
|
417
|
-
from pathlib import Path
|
|
418
|
-
|
|
419
|
-
import splent_cli
|
|
420
|
-
|
|
421
|
-
pyproject = Path(splent_cli.__file__).resolve().parents[2] / "pyproject.toml"
|
|
422
|
-
if pyproject.is_file():
|
|
423
|
-
project = load_toml(str(pyproject)).get("project", {})
|
|
424
|
-
if project.get("name") == "splent_cli" and project.get("version"):
|
|
425
|
-
return str(project["version"])
|
|
426
|
-
return version("splent_cli")
|
|
427
|
-
|
|
428
|
-
|
|
429
410
|
def runtime_pins(workspace: str) -> dict:
|
|
430
411
|
"""{package: version} the production image installs from PyPI."""
|
|
431
412
|
return {
|
|
@@ -20,12 +20,9 @@ from splent_cli.utils.template_drift import (
|
|
|
20
20
|
)
|
|
21
21
|
from splent_cli.utils.template_drift import _forge_host as _template_forge_host
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
from importlib.metadata import version as _pkg_version
|
|
23
|
+
from splent_cli.utils.running_version import cli_version as _running_cli_version
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
except Exception:
|
|
28
|
-
_CLI_VERSION = "dev"
|
|
25
|
+
_CLI_VERSION = _running_cli_version()
|
|
29
26
|
|
|
30
27
|
|
|
31
28
|
PRODUCT_NAME_RE = re.compile(r"^[a-z_][a-z0-9_]*$")
|
|
@@ -21,7 +21,7 @@ something is already wrong:
|
|
|
21
21
|
|
|
22
22
|
and two more keep what it publishes equal to what the tag says:
|
|
23
23
|
|
|
24
|
-
* origin
|
|
24
|
+
* the release branch on origin only ever receives the commit the tag describes, as a
|
|
25
25
|
fast-forward. A divergence leaves the forge half stuck, never a tag on a
|
|
26
26
|
commit no remote branch contains
|
|
27
27
|
* nothing is built from uncommitted changes, and the Docker image, whose
|
|
@@ -153,25 +153,26 @@ def _is_ancestor(path: str, ancestor: str, descendant: str) -> bool:
|
|
|
153
153
|
|
|
154
154
|
|
|
155
155
|
def plan_main_push(path: str, tag: str) -> tuple[str, str | None]:
|
|
156
|
-
"""How origin
|
|
156
|
+
"""How the release branch on origin comes to carry the commit *tag* describes.
|
|
157
157
|
|
|
158
158
|
Returns ``(state, sha)``, where *sha* is the commit that is or will be
|
|
159
159
|
tagged: the tag's commit when the tag exists locally, otherwise HEAD,
|
|
160
160
|
because that is where the tag will be created. Never HEAD when a tag
|
|
161
161
|
exists, since the operator may have committed more work since.
|
|
162
162
|
|
|
163
|
-
``contained`` origin
|
|
164
|
-
``push`` pushing it is a fast-forward of
|
|
163
|
+
``contained`` origin already has it on the branch, nothing to push
|
|
164
|
+
``push`` pushing it is a fast-forward of that branch
|
|
165
165
|
``diverged`` it is neither, so no tag can be published on it
|
|
166
|
-
``unknown``
|
|
166
|
+
``unknown`` origin has no such branch to compare with, nothing is pushed
|
|
167
167
|
``timeout`` origin did not answer in time, so nothing can be compared
|
|
168
168
|
"""
|
|
169
|
+
branch = release.release_branch(path)
|
|
169
170
|
ref = (
|
|
170
171
|
f"refs/tags/{tag}^{{commit}}" if release.local_tag_exists(path, tag) else "HEAD"
|
|
171
172
|
)
|
|
172
173
|
try:
|
|
173
174
|
subprocess.run(
|
|
174
|
-
["git", "fetch", "origin",
|
|
175
|
+
["git", "fetch", "origin", branch],
|
|
175
176
|
cwd=path,
|
|
176
177
|
capture_output=True,
|
|
177
178
|
env=_non_interactive_env(),
|
|
@@ -180,7 +181,7 @@ def plan_main_push(path: str, tag: str) -> tuple[str, str | None]:
|
|
|
180
181
|
except subprocess.TimeoutExpired:
|
|
181
182
|
return "timeout", _git_out(path, ["rev-parse", "--verify", ref])
|
|
182
183
|
sha = _git_out(path, ["rev-parse", "--verify", ref])
|
|
183
|
-
remote = _git_out(path, ["rev-parse", "--verify", "refs/remotes/origin/
|
|
184
|
+
remote = _git_out(path, ["rev-parse", "--verify", f"refs/remotes/origin/{branch}"])
|
|
184
185
|
if not sha or not remote:
|
|
185
186
|
return "unknown", sha
|
|
186
187
|
if sha == remote or _is_ancestor(path, sha, remote):
|
|
@@ -191,10 +192,11 @@ def plan_main_push(path: str, tag: str) -> tuple[str, str | None]:
|
|
|
191
192
|
|
|
192
193
|
|
|
193
194
|
def push_commit_to_main(path: str, sha: str) -> str | None:
|
|
194
|
-
"""Fast-forward origin
|
|
195
|
+
"""Fast-forward the release branch on origin to *sha*. None on success, else the reason."""
|
|
196
|
+
branch = release.release_branch(path)
|
|
195
197
|
try:
|
|
196
198
|
r = subprocess.run(
|
|
197
|
-
["git", "push", "origin", f"{sha}:refs/heads/
|
|
199
|
+
["git", "push", "origin", f"{sha}:refs/heads/{branch}"],
|
|
198
200
|
cwd=path,
|
|
199
201
|
capture_output=True,
|
|
200
202
|
text=True,
|
|
@@ -207,7 +209,7 @@ def push_commit_to_main(path: str, sha: str) -> str | None:
|
|
|
207
209
|
)
|
|
208
210
|
if r.returncode != 0:
|
|
209
211
|
return (r.stderr or "").strip() or f"git push exited {r.returncode}"
|
|
210
|
-
click.echo(f" push origin/
|
|
212
|
+
click.echo(f" push origin/{branch} updated to {sha[:12]}")
|
|
211
213
|
return None
|
|
212
214
|
|
|
213
215
|
|
|
@@ -419,7 +421,7 @@ def release_resume(target, assume_yes, no_pypi, no_forge, no_github, no_docker,
|
|
|
419
421
|
push_tag = make_release = False
|
|
420
422
|
main_sha = None
|
|
421
423
|
summary = (
|
|
422
|
-
f"origin/
|
|
424
|
+
f"origin/{release.release_branch(path)} and the commit {tag} describes have diverged, so "
|
|
423
425
|
"the tag was not pushed"
|
|
424
426
|
if main_state == "diverged"
|
|
425
427
|
else "origin did not answer 'git fetch' within "
|
|
@@ -522,7 +524,9 @@ def release_resume(target, assume_yes, no_pypi, no_forge, no_github, no_docker,
|
|
|
522
524
|
|
|
523
525
|
steps = []
|
|
524
526
|
if main_sha:
|
|
525
|
-
steps.append(
|
|
527
|
+
steps.append(
|
|
528
|
+
f"push {main_sha[:12]} to origin/{release.release_branch(path)}, the commit {tag} describes"
|
|
529
|
+
)
|
|
526
530
|
if upload:
|
|
527
531
|
steps.append(f"build and upload {package} {normalized} to PyPI")
|
|
528
532
|
if push_tag:
|
|
@@ -590,9 +594,9 @@ def release_resume(target, assume_yes, no_pypi, no_forge, no_github, no_docker,
|
|
|
590
594
|
stuck.append(
|
|
591
595
|
release_gate.ChannelStatus(
|
|
592
596
|
release_gate.FORGE,
|
|
593
|
-
summary=f"could not push {main_sha[:12]} to origin/
|
|
597
|
+
summary=f"could not push {main_sha[:12]} to origin/{release.release_branch(path)}, {failure}",
|
|
594
598
|
hints=[
|
|
595
|
-
"Fix the push to origin/
|
|
599
|
+
f"Fix the push to origin/{release.release_branch(path)}, then run "
|
|
596
600
|
f"'splent release:resume {hint_target}' again.",
|
|
597
601
|
],
|
|
598
602
|
)
|
|
@@ -604,7 +608,7 @@ def release_resume(target, assume_yes, no_pypi, no_forge, no_github, no_docker,
|
|
|
604
608
|
push_image=push_image,
|
|
605
609
|
summary=f"not built, there is no {tag} to build it from",
|
|
606
610
|
hint=f"Nothing is built before {tag} exists. Fix the push "
|
|
607
|
-
f"to origin/
|
|
611
|
+
f"to origin/{release.release_branch(path)}, then run 'splent release:resume "
|
|
608
612
|
f"{hint_target}' again.",
|
|
609
613
|
)
|
|
610
614
|
upload = push_image = False
|
|
@@ -568,16 +568,12 @@ def build_published_spls(workspace: str, lines: list[dict]) -> list[dict]:
|
|
|
568
568
|
def assemble_index(features: list[dict], spls: list[dict], sources: dict) -> dict:
|
|
569
569
|
compute_used_by(features)
|
|
570
570
|
features = sorted(features, key=lambda e: e["short"])
|
|
571
|
-
|
|
572
|
-
import importlib.metadata
|
|
571
|
+
from splent_cli.utils.running_version import cli_version
|
|
573
572
|
|
|
574
|
-
cli_version = importlib.metadata.version("splent_cli")
|
|
575
|
-
except Exception:
|
|
576
|
-
cli_version = "unknown"
|
|
577
573
|
return {
|
|
578
574
|
"schema": INDEX_SCHEMA,
|
|
579
575
|
"generated_at": datetime.now(timezone.utc).isoformat(timespec="seconds"),
|
|
580
|
-
"generator": f"splent_cli/{cli_version}",
|
|
576
|
+
"generator": f"splent_cli/{cli_version()}",
|
|
581
577
|
"sources": sources,
|
|
582
578
|
"features": features,
|
|
583
579
|
"spls": spls,
|
|
@@ -302,17 +302,61 @@ def _git_out(cwd: str, args: list[str]) -> str | None:
|
|
|
302
302
|
return r.stdout.strip() if r.returncode == 0 else None
|
|
303
303
|
|
|
304
304
|
|
|
305
|
+
_RELEASE_BRANCHES: dict[str, str] = {}
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def release_branch(cwd: str) -> str:
|
|
309
|
+
"""The branch a release pushes to: the one origin calls its default.
|
|
310
|
+
|
|
311
|
+
A repository whose default branch is master would otherwise get a second
|
|
312
|
+
branch called main that no clone checks out, and a server pulling master
|
|
313
|
+
would never see the release. Origin's HEAD as this clone recorded it,
|
|
314
|
+
else as origin reports it, else the branch checked out here, else main.
|
|
315
|
+
"""
|
|
316
|
+
key = os.path.realpath(cwd)
|
|
317
|
+
if key in _RELEASE_BRANCHES:
|
|
318
|
+
return _RELEASE_BRANCHES[key]
|
|
319
|
+
branch = None
|
|
320
|
+
ref = _git_out(
|
|
321
|
+
cwd, ["symbolic-ref", "--quiet", "--short", "refs/remotes/origin/HEAD"]
|
|
322
|
+
)
|
|
323
|
+
if ref and ref.startswith("origin/"):
|
|
324
|
+
branch = ref[len("origin/") :]
|
|
325
|
+
if not branch:
|
|
326
|
+
try:
|
|
327
|
+
r = subprocess.run(
|
|
328
|
+
["git", "ls-remote", "--symref", "origin", "HEAD"],
|
|
329
|
+
cwd=cwd,
|
|
330
|
+
capture_output=True,
|
|
331
|
+
text=True,
|
|
332
|
+
env=_non_interactive_env(),
|
|
333
|
+
timeout=GIT_NETWORK_TIMEOUT,
|
|
334
|
+
)
|
|
335
|
+
out = r.stdout if isinstance(r.stdout, str) else ""
|
|
336
|
+
m = re.search(r"^ref: refs/heads/(\S+)\s+HEAD", out, re.M)
|
|
337
|
+
branch = m.group(1) if m else None
|
|
338
|
+
except subprocess.TimeoutExpired:
|
|
339
|
+
branch = None
|
|
340
|
+
if not branch:
|
|
341
|
+
current = _git_out(cwd, ["rev-parse", "--abbrev-ref", "HEAD"])
|
|
342
|
+
if current and current != "HEAD":
|
|
343
|
+
branch = current
|
|
344
|
+
_RELEASE_BRANCHES[key] = branch or "main"
|
|
345
|
+
return _RELEASE_BRANCHES[key]
|
|
346
|
+
|
|
347
|
+
|
|
305
348
|
def push_main(cwd: str) -> None:
|
|
306
|
-
"""Push HEAD to
|
|
349
|
+
"""Push HEAD to the release branch and verify that origin really carries it.
|
|
307
350
|
|
|
308
351
|
Pushing is not the same as having pushed. A tag whose commit is on no remote
|
|
309
352
|
branch shows up on the git host as a release of source nobody can find, and
|
|
310
353
|
that is what happens when a clean working tree is read as "nothing to do".
|
|
311
354
|
"""
|
|
312
355
|
env = _non_interactive_env()
|
|
356
|
+
branch = release_branch(cwd)
|
|
313
357
|
try:
|
|
314
358
|
subprocess.run(
|
|
315
|
-
["git", "push", "origin", "HEAD:
|
|
359
|
+
["git", "push", "origin", f"HEAD:{branch}"],
|
|
316
360
|
cwd=cwd,
|
|
317
361
|
check=True,
|
|
318
362
|
capture_output=True,
|
|
@@ -322,11 +366,11 @@ def push_main(cwd: str) -> None:
|
|
|
322
366
|
)
|
|
323
367
|
except subprocess.CalledProcessError as e:
|
|
324
368
|
stderr = e.stderr.strip() if e.stderr else str(e)
|
|
325
|
-
click.secho(f" error: could not push to origin/
|
|
369
|
+
click.secho(f" error: could not push to origin/{branch}: {stderr}", fg="red")
|
|
326
370
|
raise SystemExit(1)
|
|
327
371
|
except subprocess.TimeoutExpired:
|
|
328
372
|
click.secho(
|
|
329
|
-
" error: the push to origin/
|
|
373
|
+
f" error: the push to origin/{branch} did not finish within "
|
|
330
374
|
f"{GIT_NETWORK_TIMEOUT // 60} minutes.",
|
|
331
375
|
fg="red",
|
|
332
376
|
)
|
|
@@ -335,7 +379,7 @@ def push_main(cwd: str) -> None:
|
|
|
335
379
|
head = _git_out(cwd, ["rev-parse", "HEAD"])
|
|
336
380
|
try:
|
|
337
381
|
subprocess.run(
|
|
338
|
-
["git", "fetch", "origin",
|
|
382
|
+
["git", "fetch", "origin", branch],
|
|
339
383
|
cwd=cwd,
|
|
340
384
|
capture_output=True,
|
|
341
385
|
text=True,
|
|
@@ -343,21 +387,21 @@ def push_main(cwd: str) -> None:
|
|
|
343
387
|
timeout=GIT_NETWORK_TIMEOUT,
|
|
344
388
|
)
|
|
345
389
|
except subprocess.TimeoutExpired:
|
|
346
|
-
# The push itself moved
|
|
390
|
+
# The push itself moved the remote branch in this clone, which is what the
|
|
347
391
|
# check below reads.
|
|
348
392
|
pass
|
|
349
|
-
remote = _git_out(cwd, ["rev-parse", "origin/
|
|
393
|
+
remote = _git_out(cwd, ["rev-parse", f"origin/{branch}"])
|
|
350
394
|
if head and remote and head != remote:
|
|
351
395
|
# Not necessarily wrong (someone else may have pushed on top), but the
|
|
352
396
|
# tag must describe a commit the remote branch contains.
|
|
353
397
|
contains = subprocess.run(
|
|
354
|
-
["git", "merge-base", "--is-ancestor", head, "origin/
|
|
398
|
+
["git", "merge-base", "--is-ancestor", head, f"origin/{branch}"],
|
|
355
399
|
cwd=cwd,
|
|
356
400
|
capture_output=True,
|
|
357
401
|
)
|
|
358
402
|
if contains.returncode != 0:
|
|
359
403
|
click.secho(
|
|
360
|
-
" error: origin/
|
|
404
|
+
f" error: origin/{branch} does not contain the commit being released.",
|
|
361
405
|
fg="red",
|
|
362
406
|
)
|
|
363
407
|
click.secho(
|
|
@@ -366,7 +410,7 @@ def push_main(cwd: str) -> None:
|
|
|
366
410
|
fg="yellow",
|
|
367
411
|
)
|
|
368
412
|
raise SystemExit(1)
|
|
369
|
-
click.echo(" push origin/
|
|
413
|
+
click.echo(f" push origin/{branch} updated")
|
|
370
414
|
|
|
371
415
|
|
|
372
416
|
def git_is_clean(cwd: str) -> bool:
|
|
@@ -420,7 +464,7 @@ def read_project_version(pyproject_path: str) -> str | None:
|
|
|
420
464
|
|
|
421
465
|
|
|
422
466
|
def sync_main_if_needed(cwd: str) -> None:
|
|
423
|
-
"""Make sure origin
|
|
467
|
+
"""Make sure the release branch on origin carries the commit about to be tagged.
|
|
424
468
|
|
|
425
469
|
A resume can run on a repository where the release commit was made and
|
|
426
470
|
never pushed, which is exactly the state a failed upload leaves behind.
|
|
@@ -429,9 +473,10 @@ def sync_main_if_needed(cwd: str) -> None:
|
|
|
429
473
|
left alone, because a recovery command must not resolve a divergence in
|
|
430
474
|
someone's branch on its own.
|
|
431
475
|
"""
|
|
476
|
+
branch = release_branch(cwd)
|
|
432
477
|
try:
|
|
433
478
|
subprocess.run(
|
|
434
|
-
["git", "fetch", "origin",
|
|
479
|
+
["git", "fetch", "origin", branch],
|
|
435
480
|
cwd=cwd,
|
|
436
481
|
capture_output=True,
|
|
437
482
|
text=True,
|
|
@@ -441,7 +486,7 @@ def sync_main_if_needed(cwd: str) -> None:
|
|
|
441
486
|
except subprocess.TimeoutExpired:
|
|
442
487
|
pass
|
|
443
488
|
head = _git_out(cwd, ["rev-parse", "HEAD"])
|
|
444
|
-
remote = _git_out(cwd, ["rev-parse", "origin/
|
|
489
|
+
remote = _git_out(cwd, ["rev-parse", f"origin/{branch}"])
|
|
445
490
|
if not head or not remote or head == remote:
|
|
446
491
|
return
|
|
447
492
|
|
|
@@ -455,13 +500,13 @@ def sync_main_if_needed(cwd: str) -> None:
|
|
|
455
500
|
== 0
|
|
456
501
|
)
|
|
457
502
|
|
|
458
|
-
if _is_ancestor(head, "origin/
|
|
503
|
+
if _is_ancestor(head, f"origin/{branch}"):
|
|
459
504
|
return
|
|
460
505
|
if _is_ancestor(remote, "HEAD"):
|
|
461
506
|
push_main(cwd)
|
|
462
507
|
return
|
|
463
508
|
click.secho(
|
|
464
|
-
" warn: origin/
|
|
509
|
+
f" warn: origin/{branch} and this checkout have diverged, so the commit "
|
|
465
510
|
"being tagged was not pushed. Reconcile the branch yourself.",
|
|
466
511
|
fg="yellow",
|
|
467
512
|
)
|
|
@@ -1698,7 +1743,7 @@ def run_release_pipeline(
|
|
|
1698
1743
|
try:
|
|
1699
1744
|
if to_forge:
|
|
1700
1745
|
push_main(path)
|
|
1701
|
-
accepted.append("origin/
|
|
1746
|
+
accepted.append(f"origin/{release_branch(path)}")
|
|
1702
1747
|
create_and_push_tag(path, tag)
|
|
1703
1748
|
accepted.append(f"the {tag} tag on the forge")
|
|
1704
1749
|
failure = create_github_release(
|
{splent_cli-1.34.0 → splent_cli-1.34.1}/src/splent_cli/templates/product/product_ci_upgrade.yml.j2
RENAMED
|
@@ -60,15 +60,21 @@ jobs:
|
|
|
60
60
|
git add pyproject.toml
|
|
61
61
|
git commit -m "Upgrade the pinned features"
|
|
62
62
|
git push --force "https://x-access-token:${FORGE_TOKEN}@{{ forge_host }}/${GITHUB_REPOSITORY}.git" "$BRANCH"
|
|
63
|
+
# The pull request goes to the branch the repository calls its default.
|
|
64
|
+
export BASE=$(curl --silent -H "Authorization: token ${FORGE_TOKEN}" \
|
|
65
|
+
"https://{{ forge_host }}/api/v1/repos/${GITHUB_REPOSITORY}" \
|
|
66
|
+
| python3 -c 'import json, sys; print(json.load(sys.stdin).get("default_branch") or "main")' \
|
|
67
|
+
|| echo main)
|
|
63
68
|
python3 - <<'PY' > pr.json
|
|
64
69
|
import json
|
|
70
|
+
import os
|
|
65
71
|
log = open("../upgrade.log", encoding="utf-8", errors="replace").read()
|
|
66
72
|
body = (
|
|
67
73
|
"The pinned features have newer releases that install together and "
|
|
68
74
|
"keep the product valid in its line. Review the plan below, merge, "
|
|
69
75
|
"and publish with splent product:release.\n\n```\n" + log[-60000:] + "\n```\n"
|
|
70
76
|
)
|
|
71
|
-
print(json.dumps({"head": "splent/feature-upgrades", "base": "main",
|
|
77
|
+
print(json.dumps({"head": "splent/feature-upgrades", "base": os.environ.get("BASE") or "main",
|
|
72
78
|
"title": "Upgrade the pinned features", "body": body}))
|
|
73
79
|
PY
|
|
74
80
|
curl --silent --show-error --fail -X POST \
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""The version of the CLI that is running.
|
|
2
|
+
|
|
3
|
+
An editable install records its version once, when it is installed, and the
|
|
4
|
+
checkout moves on with every release. So when the CLI runs from a checkout,
|
|
5
|
+
the checkout's pyproject.toml is the version; an installed wheel answers
|
|
6
|
+
through its metadata.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import tomllib
|
|
10
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def cli_version() -> str:
|
|
15
|
+
import splent_cli
|
|
16
|
+
|
|
17
|
+
pyproject = Path(splent_cli.__file__).resolve().parents[2] / "pyproject.toml"
|
|
18
|
+
if pyproject.is_file():
|
|
19
|
+
try:
|
|
20
|
+
project = tomllib.loads(pyproject.read_text()).get("project", {})
|
|
21
|
+
except (OSError, tomllib.TOMLDecodeError):
|
|
22
|
+
project = {}
|
|
23
|
+
if project.get("name") == "splent_cli" and project.get("version"):
|
|
24
|
+
return str(project["version"])
|
|
25
|
+
try:
|
|
26
|
+
return version("splent_cli")
|
|
27
|
+
except PackageNotFoundError:
|
|
28
|
+
return "dev"
|
|
@@ -10,12 +10,9 @@ from pathlib import Path
|
|
|
10
10
|
|
|
11
11
|
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
from importlib.metadata import version as _pkg_version
|
|
13
|
+
from splent_cli.utils.running_version import cli_version
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
except Exception:
|
|
18
|
-
CLI_VERSION = "dev"
|
|
15
|
+
CLI_VERSION = cli_version()
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
# ── Jinja helpers ─────────────────────────────────────────────────────────────
|
|
@@ -399,6 +399,9 @@ def resolve_with_pip(
|
|
|
399
399
|
"install",
|
|
400
400
|
"--dry-run",
|
|
401
401
|
"--ignore-installed",
|
|
402
|
+
# pip's HTTP cache keeps PyPI's index for minutes, so a version
|
|
403
|
+
# released moments ago would be missing from the plan.
|
|
404
|
+
"--no-cache-dir",
|
|
402
405
|
"--quiet",
|
|
403
406
|
"--disable-pip-version-check",
|
|
404
407
|
"--no-input",
|
|
@@ -273,6 +273,7 @@ src/splent_cli/utils/path_utils.py
|
|
|
273
273
|
src/splent_cli/utils/proc.py
|
|
274
274
|
src/splent_cli/utils/redact.py
|
|
275
275
|
src/splent_cli/utils/refinement_facts.py
|
|
276
|
+
src/splent_cli/utils/running_version.py
|
|
276
277
|
src/splent_cli/utils/template_drift.py
|
|
277
278
|
src/splent_cli/utils/toml_edit.py
|
|
278
279
|
src/splent_cli/utils/upgrade_plan.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
|