kanon-cli 3.0.0__tar.gz → 3.1.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.
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/CHANGELOG.md +65 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/PKG-INFO +5 -2
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/README.md +4 -1
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli/validate.md +3 -2
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/integration-testing.md +7 -7
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/list-and-add.md +5 -3
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/lockfile.md +19 -14
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/multi-source-guide.md +18 -6
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/troubleshooting.md +23 -22
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/url-canonicalization.md +0 -2
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/pyproject.toml +3 -1
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/__init__.py +1 -1
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/add.py +43 -19
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/catalog.py +2 -1
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/search.py +25 -13
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/constants.py +1 -1
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/install.py +106 -108
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/kanonenv_writer.py +9 -3
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/marketplace_validator.py +18 -13
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/version.py +26 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/README.md +1 -1
- kanon_cli-3.1.0/tests/fixtures/errors/conflict-detected.txt +5 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-add.txt +2 -1
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_error_snapshots.py +18 -6
- kanon_cli-3.1.0/tests/integration/test_install_path_conflict_integration.py +349 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_cd.py +14 -8
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_add.py +65 -15
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_add_zero_tags.py +13 -8
- kanon_cli-3.1.0/tests/unit/test_install_conflict_detection.py +318 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv_writer.py +4 -2
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_validator.py +4 -1
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search.py +29 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_version.py +30 -0
- kanon_cli-3.0.0/tests/fixtures/errors/conflict-detected.txt +0 -6
- kanon_cli-3.0.0/tests/integration/test_install_conflict_url_normalization.py +0 -426
- kanon_cli-3.0.0/tests/unit/test_install_conflict_detection.py +0 -356
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.claude/settings.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/.devcontainer.postcreate.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/VERSION +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/catalog-entry.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/devcontainer-functions.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/devcontainer.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/fix-line-endings.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/nix-family-os/README.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/nix-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/nix-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/postcreate-wrapper.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/project-setup.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/wsl-family-os/README.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/wsl-family-os/tinyproxy-daemon.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.devcontainer/wsl-family-os/tinyproxy.conf.template +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/CODEOWNERS +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/actions/setup-kanon/action.yml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/codeql-analysis.yml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/main-validation.yml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/pr-validation.yml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.github/workflows/publish.yml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.gitignore +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.markdownlint.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.pre-commit-config.yaml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.tool-versions +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/.yamllint +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/CLAUDE.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/CONTRIBUTING.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/LICENSE +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/Makefile +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/architecture.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/catalog-author-guide.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/catalog-format-versioning.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/catalogs-explained.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/claude-marketplaces-guide.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli/catalog-audit.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli/doctor.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli-reference.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/cli.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/coming-from-pip-npm-cargo.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/configuration.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/contributing.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/creating-manifest-repos.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/creating-packages.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/doctor.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/exit-codes.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/git-auth-setup.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/how-it-works.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/installation.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/lifecycle.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/migrating-existing-kanon-files.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/migration-to-add.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/outdated-and-why.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/pipeline-integration.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/README.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/internal-fs-layout.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/manifest-format.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/python-support.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/repo-hooks.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/smart-sync.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/repo/windows.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/security-model.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/setup-guide.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/shell-completion.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/test-coverage.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/testing/matrix-traceability.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/docs/version-resolution.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/git-hooks/pre-commit +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/git-hooks/pre-push +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/link +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/requirements-dev.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/requirements.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/scripts/check_archive_no_duplicates.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/__main__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/cli.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/clean.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/completion.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/doctor.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/install.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/marketplace.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/outdated.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/remove.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/repo.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/validate.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/commands/why.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/cache.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/cached_catalogs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/catalog_entries.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/catalog_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/lockfile_names.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/midtoken.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/pep440_filter.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/powershell.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/preamble.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/project_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/sanitize.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/completions/source_names.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/catalog.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/clean.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/cli_args.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/discover.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/git_runner.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/include_walker.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/kanon_hash.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/kanonenv.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/lockfile.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/manifest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/manifest_vars.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/marketplace.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/metadata.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/remote_url.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/update_check.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/url.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/core/xml_validator.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/color.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/editor.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/error.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/event_log.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/fetch.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_config.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_refs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_ssh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_superproject.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_trace2_event_log.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/git_trace2_event_log_base.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/hooks/commit-msg +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/hooks/pre-auto-gc +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/hooks.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/main.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/manifest_xml.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/pager.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/platform_utils.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/platform_utils_win32.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/progress.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/project.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/repo +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/repo_logging.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/repo_trace.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/requirements.jsonc +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/ssh.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/abandon.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/branches.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/checkout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/cherry_pick.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/diff.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/diffmanifests.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/download.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/envsubst.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/forall.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/gc.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/grep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/help.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/info.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/init.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/list.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/manifest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/overview.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/prune.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/rebase.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/selfupdate.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/smartsync.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/stage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/start.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/status.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/sync.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/subcmds/upload.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/version_constraints.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/repo/wrapper.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/concurrency.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/levenshtein.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/lock_file_path.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/src/kanon_cli/utils/spawn.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/duplicate-child-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-recommended-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/missing-required-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-1/repo-specs/multiple-blocks-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/dotted-name-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/hyphenated-name-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-2/repo-specs/uppercase-name-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-1-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-a-2-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-1-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-3/repo-specs/group-b-2-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/file-url-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/query-string-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/broken-soft-spot-4/repo-specs/unresolvable-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/legacy-catalog-dir/catalog/sample-entry/.kanon +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalog/legacy-catalog-dir/repo-specs/sample.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalogs/zero-pep440-tags/README.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/catalogs/zero-pep440-tags/repo-specs/entry-a/entry-a-marketplace.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/expected-bash.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/expected-powershell.ps1 +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/completion/expected-zsh.sh +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/entry-not-found.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/lockfile-hash-mismatch.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/lockfile-sha-unreachable.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/missing-catalog-source.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/missing-required-metadata-field.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/source-collision.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/errors/zero-pep440-tags-under-prefix.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/README.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-catalog-audit.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-catalog.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-clean.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-completion.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-doctor.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-install.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-marketplace.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-outdated.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-remove.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-search.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-toplevel.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/help/kanon-why.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/.gitignore +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/README.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/linter-test-bad.invalid-yaml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/linter-test-bad.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/linter-test-bad.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/sample-manifest.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/sample-project-config.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/test.gitconfig +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/fixtures/repo/version_constraints_data.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_add_alias_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_alias_consumer_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_argparse_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_argparse_help.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_ci_runs_operator_path_tests.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_clean_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_cli_entry_point.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_completion_snapshots.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_default_branch_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_env_int_guard_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_exit_code_matrix.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_groups_filter.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_help_snapshots.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_help_text_contract.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_home_flag_unwritable_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_init_default_branch_prerequisite_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_hermetic_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_real_kanon.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_install_v3_lock_fail_fast_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_home_store_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_repo_cli.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_repo_e2e.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_kanon_repo_lifecycle_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_lifecycle_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_make_operator_path_targets.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_marketplace_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_matrix_traceability_complete.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_provider_agnostic.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_abandon_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_abandon_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_abandon_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_branches_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_branches_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_branches_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_checkout_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_checkout_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_checkout_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_cherry_pick_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_cherry_pick_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_cherry_pick_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diff_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diff_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diff_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diffmanifests_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diffmanifests_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_diffmanifests_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_dir_override.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_download_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_download_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_download_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_envsubst_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_envsubst_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_envsubst_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_exit_codes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_forall_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_forall_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_forall_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_gc_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_gc_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_gc_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_grep_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_grep_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_grep_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_help_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_help_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_help_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_info_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_info_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_info_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_init_mirror.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_list_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_list_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_list_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_overview_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_overview_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_overview_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_passthrough.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_prune_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_prune_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_prune_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_rebase_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_rebase_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_rebase_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_disabled.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_selfupdate_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_smartsync_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_smartsync_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_smartsync_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_stage_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_stage_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_stage_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_start_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_start_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_start_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_status_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_status_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_status_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_sync_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_sync_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_sync_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_upload_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_upload_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_repo_upload_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_singular_catalog_source_inert.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_stdout_stderr_discipline.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_update_alert_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_lockfile.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_marketplace.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_xml_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_validate_xml_repo_root.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/functional/test_zero_source_clean_error.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/drift.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/test_synthetic_pytest_fixtures.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/fixtures/synthetic/upgrade_versioned.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/provider_allowlist.txt +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_bug_fixes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_consolidated_constraints_e2e.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_envsubst_integration.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_import_functional.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_linkfile_copyfile.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_linkfile_exclude_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_manifest_parsing.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_module_smoke.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_pipeline.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_run_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_repo_sync_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_version_constraints_integration.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_annotation_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_contactinfo_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_copyfile_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_default_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_extend_project_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_include_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_linkfile_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_manifest_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_manifest_server_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_notice_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_project_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_remote_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_remove_project_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_repo_hooks_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_submanifest_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/repo/test_xml_superproject_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_core.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_dry_run.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_env_var_detection.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_add_zero_tags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_auto_discovery.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_background_refresh.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cache_clock_skew.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cache_layout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_catalog_constraints.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_ci_validation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_clean_env_override_cleanup.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_clean_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_clean_paths.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cli_entry_points.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_project_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_complete_source_names.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_bash.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_powershell_subcommand.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_subcommand.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_completion_zsh.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_concurrency.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_concurrency_serialization.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_copyfile_fs_effects.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_cross_platform_contract.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doc_validation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_cache_flags_workspace_independent.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_consistency.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_default_subcheck_output.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_prune_cache.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_doctor_remote_check.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_envsubst_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_fs_fault_extended.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_fs_fault_injection.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_full_lifecycle_synthetic.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_full_user_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_git_fault_injection.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_git_retry_env.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_gitignore_idempotency.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_home_flag_store_relocation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_after_add.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_env_var_resolution.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_include_cycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_include_diamond.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_lock_file_derivation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_lockfile_replay.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_marketplace_registration.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_no_kanon_remediation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_optional_vars.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_paths.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_per_alias_gitbase.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_reconcile.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_remote_url_policy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_required_vars.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_install_strict.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_json_output_stream_discipline.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_add_placeholder_handling.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_clean_embedded.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_full_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanon_install_embedded.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_kanonenv_parsing.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_lifecycle_recovery.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_linkfile_fs_effects.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_all_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_all_versions_canonical.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_all_versions_malformed_revision_resilience.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_default.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_detail.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_filter.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_format_json.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_synthetic_catalog_variants.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_list_tree.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_lockfile_roundtrip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_marketplace_install.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_marketplace_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_marketplace_orphan_prune.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_midtoken_bash.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_midtoken_zsh.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_misc_features.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_multi_source_aggregation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_no_bundled_catalog.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_no_default_catalog.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_no_hardcoded_org_values.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_observability.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_branch_drift.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_format_json.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_outdated_refs_tags_revision_parsing.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_platform_parity.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_preamble_bash.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_preamble_zsh.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_remove_core.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_remove_dry_run.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_remove_force_integration.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_signal_handling.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_synthetic_drift_fixture.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_synthetic_upgrade_versioned_fixture.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_unicode_encoding.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_marketplace.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_marketplace_revision_existence.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_metadata.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_validate_xml.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_version_resolution.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_version_widened_bare_pep440.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_wheel_e2e.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_ambiguous.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_chain_walker.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_format_json.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_live_resolve.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_why_not_found_suggestion.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/integration/test_workspace_dir_env.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f1_s2_t5_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f5_s2_t7_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t1_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t2_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t3_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s1_t4_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t1_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t2_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t3_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t4_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t5_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s2_t6_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s3_t1_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_f6_s3_t2_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/regression/test_e0_install_relative_regression.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/_rp_helpers.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ad.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_bs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_content_pins.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_cs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_doctor_cache.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_doctor_journey.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ec.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ev.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_hv.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ic.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_id.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ks.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_lf.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_lockfile_lifecycle.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_marketplace_direct_checkout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_mk.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ms.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_ns_marketplace_and_global_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_outdated_two_source.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_pk.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rc.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_refresh_lock_existing_checkout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rls_exact_vs_range.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_abandon.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_branches.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_checkout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_cherry_pick.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_diff.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_diffmanifests.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_download.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_envsubst.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_forall.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_gc.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_grep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_help.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_info.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_init.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_list.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_manifest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_overview.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_prune.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_rebase.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_smartsync.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_stage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_start.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_status.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_sync.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_upload.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rp_wrap.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_rx.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_scenario_coverage_meta.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_search_multi_source.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_bootstrap.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_clean.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_install.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_tc_validate.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_uj.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_va.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_va_validate_lockfile.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_why_surface_query.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_why_url_path.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/scenarios/test_why_url_path_placeholder.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/security/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/security/test_security_hardening.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/test_wheel_layout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/commands/test_repo_dir_resolution.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/conftest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/.gitignore +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/README.md +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/sample-manifest.xml +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/sample-project-config.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/test.gitconfig +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/fixtures/version_constraints_data.json +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/functional/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/functional/test_features.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/__init__.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_init_mirror.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_manifest_revision_as_tag_pep440.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/subcmds/test_selfupdate_stub.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_abandon_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_branches_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug10_selfupdate_incompatible.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug11_race_condition.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug12_backup_preserved.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug13_init_reinit_warning.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug14_non_tty_log.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug15_prerelease_docs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug16_nested_var_warning.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug18_envsubst_double_parse.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug19_glob_src_error.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug1_envsubst_malformed_xml.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug20_glob_dest_file.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug2_linkfile_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug3_execv_replaces_process.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug4_symlink_overwrite.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug5_empty_envsubst_list.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug6_undefined_env_vars.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug7_git_ls_remote_retry.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug8_ls_remote_stderr.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_bug9_constraint_resolution_cache.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_checklocalpath_rules_1_5.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_checklocalpath_rules_6_11.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_checkout_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_cherrypick_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_color.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_conftest_fixtures.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_diffmanifests_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_doc_validate_git_preconditions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_download_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_editor.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_embedded_mode.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_envsubst_basic.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_envsubst_edge.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_envsubst_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_error.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_event_log.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_event_log_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_fetch.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_fixture_files.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_forall_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_config.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_refs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_superproject.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_git_trace2_event_log.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_gitconfig_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_grep_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_harness_smoke.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_hooks.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_import_verification.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_imports.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_include_path_resolution.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_info_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_init_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_list_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_main.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_main_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_main_init_download_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_makefile_lint_format.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_makefile_structure.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_makefile_test_targets.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_coverage_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_doc_rp_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_subcmd_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_xml.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_manifest_xml_pep440.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_medium_files_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_mkdtemp_cleanup.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_overview_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_package_structure.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pager.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_parselist.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_edge_1.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_edge_2.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_ops_ge.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_pep440_ops_rest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_platform_utils.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_process_isolation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_progress.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_coverage_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_coverage_threshold.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_deep_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_final_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_integration.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_metaproject_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_methods.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_project_sync.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_prune_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_rebase_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_remaining_coverage_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_envsubst_api.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_logging.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_run_api.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_sync_api.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_repo_trace.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_revision_inheritance.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_revision_tag_branch_sha.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_ruff_config.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_selfupdate_embedded.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_selfupdate_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_small_files_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_ssh.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_ssh_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_stage_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_stage_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_start_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_status_coverage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_status_gaps.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_status_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmd_imports.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_abandon.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_branches.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_checkout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_cherry_pick.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_diff.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_diffmanifests.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_download.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_envsubst.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_forall.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_gc.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_grep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_help.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_info.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_init.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_list.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_manifest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_overview.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_prune.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_rebase.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_selfupdate.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_smartsync.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_stage.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_start.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_status.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_sync.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_subcmds_upload.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_superproject_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_coverage_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_deep_boost.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_sync_massive.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_upload_deep.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_version_consolidation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_version_constraints.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_wheel_contents.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_wrapper.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_annotation_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_annotation_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_annotation_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_contactinfo_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_contactinfo_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_contactinfo_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_copyfile_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_copyfile_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_copyfile_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_default_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_default_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_default_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_extend_project_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_extend_project_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_extend_project_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_fault_malformed.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_fault_structural.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_cycles.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_include_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_linkfile_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_linkfile_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_linkfile_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_flow.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_manifest_server_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_notice_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_notice_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_notice_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_project_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_project_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_project_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remote_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remote_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remote_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remove_project_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remove_project_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_remove_project_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_repo_hooks_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_repo_hooks_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_repo_hooks_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_submanifest_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_submanifest_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_submanifest_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_attributes.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_crossref.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_flow.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xml_superproject_happy.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xmlbool.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_xmlint.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/repo/test_yamllint_config.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_accessed_at_coalescing.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_add_collision.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_background_refresh.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_bare_semver_to_tag.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cache.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cache_layout.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cache_ttl.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cached_catalogs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_check_parser.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_entry_uniqueness.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_framework.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_legacy_dir.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_metadata.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_project_tag_format.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_remote_url.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_source_name.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_strict.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_audit_tag_format.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_catalog_source_parsing.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_check_no_comments.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_ci_workflows.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_clean.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_clean_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli_args.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli_help_format.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_cli_json_stream_discipline.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_cached_catalogs.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_catalog_entries.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_catalog_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_lockfile_names.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_project_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_complete_source_names.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_completion.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_completion_sanitization.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_completion_subcommand.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_concurrency.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_conftest_scrubber.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_doctor_subcheck.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_env_int.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_install_after_add.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_outdated_refs_tags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_constants_why_lockfile.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_coverage_gaps.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_derive_source_name.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_discover.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_discover_source_names_missing_url.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_docs_embedded_architecture.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_docs_remaining_and_catalog.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_cache_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_completion_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_completion_staleness.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_consistency.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_coverage_gaps.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_effective_source.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_doctor_remote_reachability.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_env_isolation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_envsubst_subcommand.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_git_runner.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_home_flag.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_include_walker.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_color_default.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_https_enforcement.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_placeholder_validation.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_reconcile_decision.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_refresh_lock.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_refresh_lock_source.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_state_matrix.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_strict_flags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_install_strict_lock_orphan_naming.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_manifest_paths.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t14.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t4.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t5.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t6.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_t7.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_integration_testing_doc_s2_tier1.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_isolation_fixtures.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanon_hash.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv_advanced_edge_cases.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_kanonenv_edge_cases.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_levenshtein.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lock_file_path.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lockfile.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lockfile_coverage_gaps.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_lockfile_schema_migration.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_manifest.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_cmd.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_install.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_marketplace_non_plugin_skip.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_metadata.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_midtoken_splitter.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated_branch_pinned.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated_fail_on_upgrade.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_outdated_format_json.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_pep440_filter.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_powershell.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_pre_push_hook.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_preamble.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_preamble_semver_tags.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_provider_agnosticism.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_pyproject_build_config.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remote_url.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove_dry_run.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove_force.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_remove_line_endings.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_repo.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_repo_abspath.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_repo_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_resolve_catalog_dir.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_revision_resolve.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_rx_catalog_sub_repo.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_sanitize.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_all_versions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_coverage_gaps.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_detail.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_filter.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_format_json.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_search_tree.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_spawn.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_update_check.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_url.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_validate.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_validate_command.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_validate_metadata.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_version_constraint_errors.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why_ambiguity.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why_format_json.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_why_suggestions.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tests/unit/test_xml_validator.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tools/lint/check_no_comments.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/tools/test_tmp_monitor.py +0 -0
- {kanon_cli-3.0.0 → kanon_cli-3.1.0}/uv.lock +0 -0
|
@@ -2,6 +2,63 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
## v3.1.0 (2026-06-27)
|
|
6
|
+
|
|
7
|
+
### Feature
|
|
8
|
+
|
|
9
|
+
* feat: resolve catalog entries by tag namespace and accept bare project revisions #83
|
|
10
|
+
|
|
11
|
+
feat: resolve catalog entries by tag namespace and accept bare project revisions ([`6099846`](https://github.com/caylent-solutions/kanon/commit/6099846bbc1b3f5f0988564d00b05df055bb52a8))
|
|
12
|
+
|
|
13
|
+
* feat: key install conflict detection on package destination path, not repo URL
|
|
14
|
+
|
|
15
|
+
Allow the same repository to be installed at different commits for different
|
|
16
|
+
destination paths -- the mono-repo catalog case: install any version of package
|
|
17
|
+
A and any version of package B even when both live in the same repo under
|
|
18
|
+
different per-package tags. Previously `kanon install` rejected this with a
|
|
19
|
+
canonical-URL conflict whenever two sources (or two <project> entries) shared a
|
|
20
|
+
repository URL at different SHAs, which blocked multi-entry installs from a
|
|
21
|
+
per-entry-tagged mono-repo catalog.
|
|
22
|
+
|
|
23
|
+
- Replace the URL-keyed pre-flight (_detect_canonical_url_conflicts,
|
|
24
|
+
ResolvedProject, CanonicalUrlConflictError, _gather_resolved_projects) with a
|
|
25
|
+
destination-path-keyed check (_detect_package_path_conflicts, PackagePin,
|
|
26
|
+
PackagePathConflictError, _gather_package_pins) sourced from the per-source
|
|
27
|
+
content pins. The genuine invariant: no two <project> entries may occupy the
|
|
28
|
+
same .packages/<path> slot with different content. Same path + same SHA is a
|
|
29
|
+
benign duplicate; different paths are always allowed. Source/catalog manifest
|
|
30
|
+
entries are excluded (they never occupy a .packages/ slot). No lockfile schema
|
|
31
|
+
bump -- content_pins already carry path + resolved_sha.
|
|
32
|
+
- aggregate_symlinks remains the on-disk backstop for duplicate package names.
|
|
33
|
+
- Rewrite the unit + integration conflict tests for the path-keyed semantics
|
|
34
|
+
(including the same-repo/different-path/different-SHA success case), rename the
|
|
35
|
+
integration file, update the CD scenarios and the conflict error snapshot, and
|
|
36
|
+
update the multi-source / lockfile / url-canonicalization / troubleshooting /
|
|
37
|
+
integration-testing docs. ([`6f4f9a8`](https://github.com/caylent-solutions/kanon/commit/6f4f9a891504e890076776f0be6785573e0f1f59))
|
|
38
|
+
|
|
39
|
+
* feat: resolve catalog entries by tag namespace and accept bare project revisions
|
|
40
|
+
|
|
41
|
+
Exercising the catalog surfaced resolution bugs and the need to support
|
|
42
|
+
both a per-entry namespaced tag (refs/tags/<name>/<pep440>) and a bare
|
|
43
|
+
PEP 440 tag (refs/tags/<pep440>) for single-purpose repos, for both
|
|
44
|
+
`kanon add` resolution and a manifest `<project revision>` (kanon#82).
|
|
45
|
+
|
|
46
|
+
- Add version.select_entry_namespace, the shared namespaced-if-present-
|
|
47
|
+
else-bare rule. Scope `kanon add` default/explicit resolution
|
|
48
|
+
(commands/add._resolve_spec) and `kanon search`
|
|
49
|
+
(commands/search._list_namespaced_version_tags) to the entry tag
|
|
50
|
+
namespace, so `kanon add history` resolves refs/tags/history/<pep440>
|
|
51
|
+
rather than an unrelated legacy tag and cross-entry versions never collide.
|
|
52
|
+
- Accept a bare refs/tags/<pep440> `<project revision>`
|
|
53
|
+
(core/marketplace_validator._is_pinnable_revision, constants.REFS_TAGS_RE)
|
|
54
|
+
and update the invalid-revision hints. Resolves kanon#82.
|
|
55
|
+
- Replace Path.read_text/write_text(newline=...) (3.13+) with
|
|
56
|
+
Path.open(newline=...) in core/kanonenv_writer so requires-python >=3.11 holds.
|
|
57
|
+
- Write the .kanon dependency block NAME-first with a blank line after the
|
|
58
|
+
CLAUDE_MARKETPLACES_DIR header.
|
|
59
|
+
- Tests, docs, and the kanon-add help snapshot updated. ([`7ed332c`](https://github.com/caylent-solutions/kanon/commit/7ed332c859e69cfd6635035a05c15c03339fdcd1))
|
|
60
|
+
|
|
61
|
+
|
|
5
62
|
## v3.0.0 (2026-06-26)
|
|
6
63
|
|
|
7
64
|
### Breaking
|
|
@@ -40,6 +97,10 @@ runs unit + integration + functional + scenario + `make test` as independent ste
|
|
|
40
97
|
per-unit validation time substantially. pytest-xdist parallelism was evaluated and reverted:
|
|
41
98
|
the suite's test collection is non-deterministic across xdist workers (gw collection mismatch). ([`a8b3441`](https://github.com/caylent-solutions/kanon/commit/a8b344134cb2eba39ed3f48aee812e27ce7167e1))
|
|
42
99
|
|
|
100
|
+
### Chore
|
|
101
|
+
|
|
102
|
+
* chore(release): 3.0.0 ([`a76fa87`](https://github.com/caylent-solutions/kanon/commit/a76fa8742ff8634d3e3ddbcdb797d230139ec5d2))
|
|
103
|
+
|
|
43
104
|
### Ci
|
|
44
105
|
|
|
45
106
|
* ci: split CI into Linux + Windows sets with platform markers; fix cross-platform bugs
|
|
@@ -417,6 +478,10 @@ fixtures, so the functional `test_help_snapshot[kanon-add]` / `[kanon-remove]` b
|
|
|
417
478
|
|
|
418
479
|
### Unknown
|
|
419
480
|
|
|
481
|
+
* Merge pull request #81 from caylent-solutions/release-3.0.0
|
|
482
|
+
|
|
483
|
+
Release 3.0.0 ([`145232a`](https://github.com/caylent-solutions/kanon/commit/145232aae70aab56a8715fa195f09633798ff2fa))
|
|
484
|
+
|
|
420
485
|
* P3: triple test coverage + --home/--store-dir flag + LockfileSchemaError fail-fast; ruff 0.11.13 format parity
|
|
421
486
|
|
|
422
487
|
Coverage (P3 audit found 10 gaps of 35 change-inventory items; 25 already fully covered): add real
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kanon-cli
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.1.0
|
|
4
4
|
Summary: Kanon (Kanon Package Manager) CLI tool
|
|
5
5
|
Project-URL: Homepage, https://github.com/caylent-solutions/kanon
|
|
6
6
|
Project-URL: Issues, https://github.com/caylent-solutions/kanon/issues
|
|
@@ -1245,7 +1245,10 @@ Constraints resolve to the best matching tag at sync time.
|
|
|
1245
1245
|
|
|
1246
1246
|
The resolver splits the `revision` attribute at the last `/` into a tag-path
|
|
1247
1247
|
prefix and a constraint. It filters available tags by that prefix, evaluates
|
|
1248
|
-
the constraint, and returns the highest matching version.
|
|
1248
|
+
the constraint, and returns the highest matching version. The prefix is
|
|
1249
|
+
optional: `refs/tags/<pep440>` (and a bare constraint such as `~=1.0.0`)
|
|
1250
|
+
resolves against the bare `refs/tags/` namespace for single-purpose repos,
|
|
1251
|
+
while `refs/tags/<name>/<pep440>` scopes to that namespace.
|
|
1249
1252
|
|
|
1250
1253
|
```text
|
|
1251
1254
|
revision="refs/tags/example/development/dev-lint/~=1.2.0"
|
|
@@ -1223,7 +1223,10 @@ Constraints resolve to the best matching tag at sync time.
|
|
|
1223
1223
|
|
|
1224
1224
|
The resolver splits the `revision` attribute at the last `/` into a tag-path
|
|
1225
1225
|
prefix and a constraint. It filters available tags by that prefix, evaluates
|
|
1226
|
-
the constraint, and returns the highest matching version.
|
|
1226
|
+
the constraint, and returns the highest matching version. The prefix is
|
|
1227
|
+
optional: `refs/tags/<pep440>` (and a bare constraint such as `~=1.0.0`)
|
|
1228
|
+
resolves against the bare `refs/tags/` namespace for single-purpose repos,
|
|
1229
|
+
while `refs/tags/<name>/<pep440>` scopes to that namespace.
|
|
1227
1230
|
|
|
1228
1231
|
```text
|
|
1229
1232
|
revision="refs/tags/example/development/dev-lint/~=1.2.0"
|
|
@@ -76,8 +76,9 @@ manifest correctness.
|
|
|
76
76
|
- Project path values (`<project path="...">`) are unique across all marketplace
|
|
77
77
|
files.
|
|
78
78
|
- Revision attributes (`<project revision="...">`) use one of the allowed
|
|
79
|
-
pinnable formats: an exact
|
|
80
|
-
|
|
79
|
+
pinnable formats: an exact tag `refs/tags/<path>/<pep440>` (namespaced) or
|
|
80
|
+
`refs/tags/<pep440>` (bare, for single-purpose repos), a branch ref
|
|
81
|
+
`refs/heads/<name>`, or a 40-hex commit SHA. The wildcard `*`,
|
|
81
82
|
a bare branch name (e.g. `main` without the `refs/heads/` prefix), and
|
|
82
83
|
version-range constraints (`>=X,<Y`, `~=`) are rejected. On install a tag
|
|
83
84
|
or branch revision resolves to a content SHA pinned in `.kanon.lock`
|
|
@@ -819,7 +819,7 @@ rm -rf "${MS01_DIR}"
|
|
|
819
819
|
|
|
820
820
|
## 7. Category 6: Collision Detection (2 tests)
|
|
821
821
|
|
|
822
|
-
### CD-01: Two sources
|
|
822
|
+
### CD-01: Two sources resolving the same destination path to different content
|
|
823
823
|
|
|
824
824
|
```bash
|
|
825
825
|
export CD01_DIR="${KANON_TEST_ROOT}/test-cd01"
|
|
@@ -845,7 +845,7 @@ kanon install .kanon
|
|
|
845
845
|
**Pass criteria:**
|
|
846
846
|
|
|
847
847
|
- Exit code 1
|
|
848
|
-
- stderr contains `Package
|
|
848
|
+
- stderr contains `Package destination conflict` and `.packages/pkg-alpha`
|
|
849
849
|
|
|
850
850
|
**Cleanup:**
|
|
851
851
|
|
|
@@ -853,7 +853,7 @@ kanon install .kanon
|
|
|
853
853
|
rm -rf "${CD01_DIR}"
|
|
854
854
|
```
|
|
855
855
|
|
|
856
|
-
### CD-02: Three sources,
|
|
856
|
+
### CD-02: Three sources, two resolving the same destination path to different content
|
|
857
857
|
|
|
858
858
|
```bash
|
|
859
859
|
export CD02_DIR="${KANON_TEST_ROOT}/test-cd02"
|
|
@@ -884,8 +884,8 @@ kanon install .kanon
|
|
|
884
884
|
**Pass criteria:**
|
|
885
885
|
|
|
886
886
|
- Exit code 1
|
|
887
|
-
- stderr contains `Package
|
|
888
|
-
-
|
|
887
|
+
- stderr contains `Package destination conflict` and `.packages/pkg-alpha`
|
|
888
|
+
- The conflict names the sources resolving `.packages/pkg-alpha` to different content (`aaa`/`ccc` pin one commit, `bbb` pins another)
|
|
889
889
|
|
|
890
890
|
**Cleanup:**
|
|
891
891
|
|
|
@@ -6194,8 +6194,8 @@ After running every scenario from §2 through §28, populate this spreadsheet-st
|
|
|
6194
6194
|
| 018 | IC-03 | install-clean | Comments and blank lines | | | | |
|
|
6195
6195
|
| 019 | IC-04 | install-clean | Marketplace install false | | | | |
|
|
6196
6196
|
| 020 | MS-01 | multi-source | Two sources aggregate | | | | |
|
|
6197
|
-
| 021 | CD-01 | collision |
|
|
6198
|
-
| 022 | CD-02 | collision | Three
|
|
6197
|
+
| 021 | CD-01 | collision | Two sources, same destination path, different content | | | | |
|
|
6198
|
+
| 022 | CD-02 | collision | Three sources, two share a destination path | | | | |
|
|
6199
6199
|
| 023 | LF-01 | linkfile | linkfile creates symlinks | | | | |
|
|
6200
6200
|
| 024 | EC-01 | error-cases | Missing .kanon | | | | |
|
|
6201
6201
|
| 025 | EC-02 | error-cases | Empty .kanon | | | | |
|
|
@@ -301,15 +301,17 @@ Those checks belong to `kanon catalog audit`. A successful
|
|
|
301
301
|
- `<name>` must match a `<catalog-metadata><name>` value in
|
|
302
302
|
the resolved manifest repo.
|
|
303
303
|
- `@<spec>` is optional. Default: the highest PEP 440-valid git
|
|
304
|
-
tag
|
|
304
|
+
tag in the entry's tag namespace (see "Default spec resolution").
|
|
305
305
|
- Multiple `<name>[@<spec>]` arguments may be supplied in one
|
|
306
306
|
invocation.
|
|
307
307
|
|
|
308
308
|
### add -- Default spec resolution
|
|
309
309
|
|
|
310
310
|
When `@<spec>` is omitted, `kanon add` queries the manifest
|
|
311
|
-
repo for
|
|
312
|
-
|
|
311
|
+
repo via `git ls-remote --tags` for the highest PEP 440-valid
|
|
312
|
+
git tag in the entry's `refs/tags/<name>/` namespace, falling
|
|
313
|
+
back to the bare `refs/tags/<pep440>` namespace when the entry
|
|
314
|
+
has no namespaced tags. If zero PEP 440-valid tags exist:
|
|
313
315
|
|
|
314
316
|
```text
|
|
315
317
|
ERROR: manifest repo has no PEP 440-valid tags; pin to a
|
|
@@ -213,9 +213,9 @@ include.
|
|
|
213
213
|
**`url`** (string) -- Raw project URL as declared in the catalog XML.
|
|
214
214
|
|
|
215
215
|
**`canonical_url`** (string) -- Canonical form of `url` (output of
|
|
216
|
-
`canonicalize_repo_url`). Used for
|
|
217
|
-
|
|
218
|
-
|
|
216
|
+
`canonicalize_repo_url`). Used by `kanon why` for URL matching. (Install
|
|
217
|
+
conflict detection is keyed on the package destination path, not the URL --
|
|
218
|
+
see "Package destination conflict" below.)
|
|
219
219
|
|
|
220
220
|
**`ref_spec`** (string) -- Version / ref constraint for this project (the
|
|
221
221
|
v4 rename of the former `revision_spec`). Written at lock time.
|
|
@@ -276,9 +276,10 @@ Exception: `LockfileValidationError`.
|
|
|
276
276
|
|
|
277
277
|
This `ref_spec` is the source / catalog ref-spec. It is distinct from a
|
|
278
278
|
manifest `<project revision>` (the content revision validated by
|
|
279
|
-
`kanon validate marketplace`), which accepts an exact
|
|
280
|
-
(`refs/tags/<path>/<pep440>`
|
|
281
|
-
40-hex commit SHA, and rejects the
|
|
279
|
+
`kanon validate marketplace`), which accepts an exact tag
|
|
280
|
+
(`refs/tags/<path>/<pep440>` namespaced or `refs/tags/<pep440>` bare), a
|
|
281
|
+
branch ref (`refs/heads/<name>`), or a 40-hex commit SHA, and rejects the
|
|
282
|
+
`*` wildcard, a bare branch name, and
|
|
282
283
|
version-range constraints. On install a tag or branch `<project revision>`
|
|
283
284
|
resolves to a content SHA pinned in `[[sources.content_pins]]`, so a
|
|
284
285
|
branch revision does not pin a moving target.
|
|
@@ -391,9 +392,10 @@ source's resolved manifest tree, captured after `repo sync`:
|
|
|
391
392
|
lock time.
|
|
392
393
|
|
|
393
394
|
A reinstall replays each locked content SHA byte-for-byte (npm-style
|
|
394
|
-
content-SHA locking). A manifest `<project revision>` may be an exact
|
|
395
|
-
|
|
396
|
-
(`refs/heads/<name>`), or a 40-hex commit SHA. On install a tag
|
|
395
|
+
content-SHA locking). A manifest `<project revision>` may be an exact tag
|
|
396
|
+
(`refs/tags/<path>/<pep440>` namespaced or `refs/tags/<pep440>` bare), a
|
|
397
|
+
branch ref (`refs/heads/<name>`), or a 40-hex commit SHA. On install a tag
|
|
398
|
+
or branch
|
|
397
399
|
revision resolves to a content SHA that is pinned here, so a branch
|
|
398
400
|
revision does NOT pin a moving target: the locked SHA is replayed until an
|
|
399
401
|
explicit `kanon install --refresh-lock` re-resolves it.
|
|
@@ -690,12 +692,15 @@ If a `resolved_sha` recorded in the lockfile is no longer reachable on
|
|
|
690
692
|
the remote, `kanon install` exits with `LockfileUnreachableShaError`.
|
|
691
693
|
This is a hard error.
|
|
692
694
|
|
|
693
|
-
###
|
|
695
|
+
### Package destination conflict
|
|
694
696
|
|
|
695
|
-
When two or more
|
|
696
|
-
|
|
697
|
-
`
|
|
698
|
-
|
|
697
|
+
When two or more sources resolve the same package destination path
|
|
698
|
+
(`.packages/<name>`, recorded in `[[sources.content_pins]]`) to different
|
|
699
|
+
content SHAs, `kanon install` exits with `PackagePathConflictError`. The same
|
|
700
|
+
repository fetched at different commits for **different** destination paths is
|
|
701
|
+
allowed (independent packages from a mono-repo); only a same-path /
|
|
702
|
+
different-content clash is an error. This check runs both during fresh
|
|
703
|
+
resolution and during `LOCKFILE_CONSISTENT` replay.
|
|
699
704
|
|
|
700
705
|
---
|
|
701
706
|
|
|
@@ -308,15 +308,27 @@ which source provided them.
|
|
|
308
308
|
|
|
309
309
|
## Collision Detection
|
|
310
310
|
|
|
311
|
-
|
|
312
|
-
|
|
311
|
+
Kanon's install conflict check is keyed on the package **destination path**
|
|
312
|
+
(`.packages/<name>`), not on the repository URL. Two sources may fetch the
|
|
313
|
+
**same repository at different commits** as long as their `<project>` entries
|
|
314
|
+
land at **different** destination paths -- this is the mono-repo case: install
|
|
315
|
+
any version of package A and any version of package B even when both live in the
|
|
316
|
+
same repo under different per-package tags. The only hard error is two sources
|
|
317
|
+
resolving the **same** `.packages/<name>` slot to **different content**.
|
|
318
|
+
|
|
319
|
+
When two sources produce a package at the same destination with different
|
|
320
|
+
content, Kanon detects the collision and fails immediately with an actionable
|
|
321
|
+
error message.
|
|
313
322
|
|
|
314
323
|
### How It Works
|
|
315
324
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
325
|
+
A pre-flight check (`kanon install`) groups every source's resolved content pins
|
|
326
|
+
by destination path; a path claimed with more than one content SHA is a
|
|
327
|
+
`PackagePathConflictError` (the same path at the same SHA is a benign duplicate).
|
|
328
|
+
During symlink aggregation, Kanon additionally tracks which source provided each
|
|
329
|
+
package name as an on-disk backstop: if a package name already exists from a
|
|
330
|
+
previous source, aggregation aborts with an error identifying both the
|
|
331
|
+
conflicting sources and the duplicate package name.
|
|
320
332
|
|
|
321
333
|
### Example Error
|
|
322
334
|
|
|
@@ -568,41 +568,42 @@ The following documents provide broader context:
|
|
|
568
568
|
|
|
569
569
|
---
|
|
570
570
|
|
|
571
|
-
## 12.
|
|
571
|
+
## 12. Package Destination Conflict
|
|
572
572
|
|
|
573
573
|
### Symptom
|
|
574
574
|
|
|
575
575
|
`kanon install` exits non-zero with:
|
|
576
576
|
|
|
577
577
|
```text
|
|
578
|
-
ERROR:
|
|
579
|
-
|
|
580
|
-
Conflict for
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
https://gitserver/org/example-package.git @ bbbb...bbbb
|
|
586
|
-
both URLs canonicalize to:
|
|
587
|
-
https://gitserver/org/example-package
|
|
588
|
-
Remediation: Use 'kanon why https://gitserver/org/example-package'
|
|
589
|
-
to investigate; resolve by removing one source or aligning REVISION
|
|
590
|
-
values across sources.
|
|
578
|
+
ERROR: Package destination conflict -- two or more sources resolve the
|
|
579
|
+
same package path to different content.
|
|
580
|
+
Conflict for package path: .packages/shared-lib
|
|
581
|
+
source_a (shared-lib): .packages/shared-lib @ aaaa...aaaa
|
|
582
|
+
source_b (shared-lib): .packages/shared-lib @ bbbb...bbbb
|
|
583
|
+
Remediation: remove one source or align the project revisions so
|
|
584
|
+
'.packages/shared-lib' resolves to a single content SHA.
|
|
591
585
|
```
|
|
592
586
|
|
|
587
|
+
This fires only when two sources resolve the **same** `.packages/<name>`
|
|
588
|
+
slot to **different** content. Fetching the **same repository at different
|
|
589
|
+
commits** is fine when the `<project>` entries land at **different**
|
|
590
|
+
destination paths (the mono-repo case -- install any version of package A and
|
|
591
|
+
any version of package B from one repo).
|
|
592
|
+
|
|
593
593
|
### Reproducer
|
|
594
594
|
|
|
595
595
|
```bash
|
|
596
|
-
# Two sources
|
|
596
|
+
# Two sources whose <project path> both resolve to .packages/shared-lib
|
|
597
|
+
# at different commits:
|
|
597
598
|
kanon install
|
|
598
599
|
```
|
|
599
600
|
|
|
600
601
|
### Fix
|
|
601
602
|
|
|
602
|
-
**Option 1: Align the
|
|
603
|
+
**Option 1: Align the revisions.**
|
|
603
604
|
|
|
604
|
-
Edit `.kanon` so
|
|
605
|
-
|
|
605
|
+
Edit `.kanon` (or the catalog manifests) so both declarations resolve the
|
|
606
|
+
shared `.packages/<name>` path to the same commit.
|
|
606
607
|
|
|
607
608
|
**Option 2: Remove one conflicting source.**
|
|
608
609
|
|
|
@@ -611,11 +612,11 @@ kanon remove <source-name>
|
|
|
611
612
|
kanon install
|
|
612
613
|
```
|
|
613
614
|
|
|
614
|
-
**Option 3:
|
|
615
|
+
**Option 3: Give the packages distinct destination paths.**
|
|
615
616
|
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
617
|
+
If the two `<project>` entries are genuinely different packages, set a
|
|
618
|
+
distinct `<project path>` for each so they no longer share a `.packages/`
|
|
619
|
+
slot.
|
|
619
620
|
|
|
620
621
|
### See also
|
|
621
622
|
|
|
@@ -90,8 +90,6 @@ The following kanon features use `canonicalize_repo_url` for URL matching:
|
|
|
90
90
|
|
|
91
91
|
- **Lockfile `canonical_url` field** (spec Section 5) -- every entry in the
|
|
92
92
|
lockfile stores the canonical form of the dependency URL.
|
|
93
|
-
- **Conflict detection** (spec Section 4.7) -- two sources conflict when their
|
|
94
|
-
canonical URLs are equal.
|
|
95
93
|
- **`kanon why` URL matching** (spec Section 4.5) -- the query URL is
|
|
96
94
|
canonicalized before comparison against lockfile entries.
|
|
97
95
|
- **`kanon outdated` URL matching** -- canonical URLs are used to correlate
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "kanon-cli"
|
|
7
|
-
version = "3.
|
|
7
|
+
version = "3.1.0"
|
|
8
8
|
description = "Kanon (Kanon Package Manager) CLI tool"
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -40,6 +40,7 @@ Issues = "https://github.com/caylent-solutions/kanon/issues"
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
|
|
43
|
+
|
|
43
44
|
[tool.hatch.build.targets.wheel]
|
|
44
45
|
packages = [
|
|
45
46
|
"src/kanon_cli",
|
|
@@ -134,6 +135,7 @@ enabled = false
|
|
|
134
135
|
[tool.pymarkdown.plugins.md024]
|
|
135
136
|
siblings_only = true
|
|
136
137
|
|
|
138
|
+
|
|
137
139
|
[dependency-groups]
|
|
138
140
|
dev = [
|
|
139
141
|
"build>=1.4.3",
|
|
@@ -77,7 +77,13 @@ from kanon_cli.core.metadata import (
|
|
|
77
77
|
derive_source_name,
|
|
78
78
|
find_catalog_entry_files,
|
|
79
79
|
)
|
|
80
|
-
from kanon_cli.version import
|
|
80
|
+
from kanon_cli.version import (
|
|
81
|
+
_list_tags,
|
|
82
|
+
_resolve_constraint_from_tags,
|
|
83
|
+
is_version_constraint,
|
|
84
|
+
resolve_version,
|
|
85
|
+
select_entry_namespace,
|
|
86
|
+
)
|
|
81
87
|
|
|
82
88
|
|
|
83
89
|
_ZERO_PEP440_TAGS_ERROR = (
|
|
@@ -119,7 +125,8 @@ def register(subparsers: "argparse._SubParsersAction[argparse.ArgumentParser]")
|
|
|
119
125
|
"constraint (e.g. ==1.0.0, ~=1.2, >=1.0.0,<2.0.0). The last '@' in\n"
|
|
120
126
|
"each argument is the delimiter -- see spec Section 4.0 resolver rules.\n"
|
|
121
127
|
"When <spec> is omitted the highest PEP 440-valid git tag in the\n"
|
|
122
|
-
"
|
|
128
|
+
"entry's refs/tags/<name>/ namespace is selected, or the highest\n"
|
|
129
|
+
"bare refs/tags/<pep440> tag when the entry has no namespaced tags."
|
|
123
130
|
),
|
|
124
131
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
125
132
|
epilog=(
|
|
@@ -790,10 +797,10 @@ def _build_source_block_lines(
|
|
|
790
797
|
prefix = f"{SOURCE_PREFIX}{source_name}"
|
|
791
798
|
|
|
792
799
|
lines = [
|
|
793
|
-
f"{prefix}
|
|
800
|
+
f"{prefix}_NAME={name}",
|
|
794
801
|
f"{prefix}_REF={ref}",
|
|
802
|
+
f"{prefix}_URL={url}",
|
|
795
803
|
f"{prefix}_PATH={path}",
|
|
796
|
-
f"{prefix}_NAME={name}",
|
|
797
804
|
]
|
|
798
805
|
lines.extend(env_var_lines)
|
|
799
806
|
if marketplace:
|
|
@@ -941,37 +948,52 @@ def _find_entry_by_name(
|
|
|
941
948
|
sys.exit(1)
|
|
942
949
|
|
|
943
950
|
|
|
944
|
-
def _resolve_spec(url: str, spec: str | None) -> str:
|
|
945
|
-
"""Resolve the version spec for a catalog entry.
|
|
951
|
+
def _resolve_spec(entry_name: str, url: str, spec: str | None) -> str:
|
|
952
|
+
"""Resolve the version spec for a catalog entry, scoped to its tag namespace.
|
|
953
|
+
|
|
954
|
+
A catalog may tag an entry under a per-entry namespace
|
|
955
|
+
(``refs/tags/<entry_name>/<pep440>``) or with bare ``refs/tags/<pep440>``
|
|
956
|
+
tags. Resolution scopes to the entry's namespace when such tags exist (so
|
|
957
|
+
``kanon add history`` resolves the highest ``refs/tags/history/<pep440>`` and
|
|
958
|
+
never another entry's tag), and falls back to the bare namespace otherwise
|
|
959
|
+
(a single-purpose, poly repo). The chosen namespace comes from
|
|
960
|
+
:func:`kanon_cli.version.select_entry_namespace`, the rule shared with
|
|
961
|
+
``kanon search``.
|
|
946
962
|
|
|
947
|
-
When spec is None (default-spec path), selects the highest PEP 440-valid
|
|
948
|
-
|
|
963
|
+
When spec is None (default-spec path), selects the highest PEP 440-valid git
|
|
964
|
+
tag in the resolved namespace via git ls-remote --tags. Raises SystemExit
|
|
949
965
|
with the spec-verbatim error if:
|
|
950
966
|
|
|
951
967
|
- The repo has zero tags total (AC-FUNC-002), or
|
|
952
|
-
- The
|
|
953
|
-
(AC-FUNC-003). In this subcase the first
|
|
954
|
-
are printed so the operator can identify the
|
|
968
|
+
- The resolved namespace has tags but none parse as
|
|
969
|
+
``packaging.version.Version`` (AC-FUNC-003). In this subcase the first
|
|
970
|
+
up-to-10 skipped tag names are printed so the operator can identify the
|
|
971
|
+
offending tags.
|
|
955
972
|
|
|
956
|
-
When spec is a non-empty string, delegates to resolve_version() to
|
|
957
|
-
|
|
973
|
+
When spec is a non-empty string, delegates to resolve_version() to resolve
|
|
974
|
+
the PEP 440 constraint within the resolved namespace (AC-FUNC-005).
|
|
958
975
|
|
|
959
976
|
Args:
|
|
977
|
+
entry_name: The catalog entry name (its per-entry tag namespace).
|
|
960
978
|
url: The manifest repo git URL.
|
|
961
979
|
spec: The version spec string (e.g. '==1.0.0', '~=1.2') or None.
|
|
962
980
|
|
|
963
981
|
Returns:
|
|
964
|
-
A full tag ref string (e.g. 'refs/tags/1.
|
|
982
|
+
A full tag ref string (e.g. 'refs/tags/history/0.1.1').
|
|
965
983
|
"""
|
|
984
|
+
tags = _list_tags(url)
|
|
985
|
+
namespace = select_entry_namespace(tags, entry_name)
|
|
986
|
+
scope_prefix = f"refs/tags/{namespace}/" if namespace is not None else "refs/tags/"
|
|
987
|
+
|
|
966
988
|
if spec is None:
|
|
967
|
-
tags = _list_tags(url)
|
|
968
989
|
if not tags:
|
|
969
990
|
print(f"ERROR: {_ZERO_PEP440_TAGS_ERROR}", file=sys.stderr)
|
|
970
991
|
sys.exit(1)
|
|
971
992
|
|
|
993
|
+
scoped_tags = [tag for tag in tags if tag.startswith(scope_prefix)]
|
|
972
994
|
skipped: list[str] = []
|
|
973
995
|
has_pep440 = False
|
|
974
|
-
for tag in
|
|
996
|
+
for tag in scoped_tags:
|
|
975
997
|
last = tag.rsplit("/", 1)[-1]
|
|
976
998
|
try:
|
|
977
999
|
Version(last)
|
|
@@ -991,9 +1013,11 @@ def _resolve_spec(url: str, spec: str | None) -> str:
|
|
|
991
1013
|
print("\n".join(lines), file=sys.stderr)
|
|
992
1014
|
sys.exit(1)
|
|
993
1015
|
|
|
994
|
-
|
|
1016
|
+
constraint = f"refs/tags/{namespace}/*" if namespace is not None else "*"
|
|
1017
|
+
return _resolve_constraint_from_tags(constraint, tags)
|
|
995
1018
|
|
|
996
|
-
|
|
1019
|
+
namespaced_spec = f"refs/tags/{namespace}/{spec}" if namespace is not None else spec
|
|
1020
|
+
return resolve_version(url, namespaced_spec)
|
|
997
1021
|
|
|
998
1022
|
|
|
999
1023
|
def _resolve_manifest_repo_for_add(
|
|
@@ -1457,7 +1481,7 @@ def run_add(args: argparse.Namespace) -> int:
|
|
|
1457
1481
|
|
|
1458
1482
|
metadata, xml_path, entry_url = _find_entry_by_name(name, catalog)
|
|
1459
1483
|
|
|
1460
|
-
resolved_revision = _resolve_spec(entry_url, spec)
|
|
1484
|
+
resolved_revision = _resolve_spec(name, entry_url, spec)
|
|
1461
1485
|
|
|
1462
1486
|
base_alias = derive_source_name(metadata.name)
|
|
1463
1487
|
|
|
@@ -655,7 +655,8 @@ def _check_project_revision_exact_tags(target_path: pathlib.Path) -> list[AuditF
|
|
|
655
655
|
),
|
|
656
656
|
remediation=(
|
|
657
657
|
f"Pin {project_name!r} to an exact tag refs/tags/<path>/<pep440> "
|
|
658
|
-
"(e.g. refs/tags/my-plugin/1.0.0
|
|
658
|
+
"or refs/tags/<pep440> (e.g. refs/tags/my-plugin/1.0.0 or "
|
|
659
|
+
"refs/tags/1.0.0), a branch ref refs/heads/<name>, "
|
|
659
660
|
"or a 40-hex commit SHA. "
|
|
660
661
|
"Run 'kanon validate marketplace' to confirm the manifest is clean."
|
|
661
662
|
),
|
|
@@ -82,7 +82,7 @@ from kanon_cli.core.metadata import (
|
|
|
82
82
|
_parse_catalog_metadata,
|
|
83
83
|
find_catalog_entry_files,
|
|
84
84
|
)
|
|
85
|
-
from kanon_cli.version import _list_branch_head, is_version_constraint, resolve_version
|
|
85
|
+
from kanon_cli.version import _list_branch_head, is_version_constraint, resolve_version, select_entry_namespace
|
|
86
86
|
|
|
87
87
|
|
|
88
88
|
_LATEST_TIP_MARKER = "latest"
|
|
@@ -268,30 +268,33 @@ def _resolve_search_ttl() -> int:
|
|
|
268
268
|
|
|
269
269
|
|
|
270
270
|
def _list_namespaced_version_tags(url: str, entry_name: str) -> list[str]:
|
|
271
|
-
"""Return PEP 440 version strings
|
|
271
|
+
"""Return a catalog entry's PEP 440 version strings, newest-first.
|
|
272
272
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
``
|
|
276
|
-
|
|
273
|
+
Lists the manifest repo's tags once via ``git ls-remote --tags`` and scopes
|
|
274
|
+
them with :func:`kanon_cli.version.select_entry_namespace`, the rule shared
|
|
275
|
+
with ``kanon add`` (spec Section 4.1 / Section 6): when the entry has
|
|
276
|
+
``refs/tags/<entry_name>/<pep440>`` tags those are used; otherwise the bare
|
|
277
|
+
``refs/tags/<pep440>`` tags are used (a single-purpose, poly repo). Peeled
|
|
278
|
+
``^{}`` deref lines, other entries' namespaced tags, and non-PEP-440 last
|
|
279
|
+
components are dropped. Listing once and selecting the namespace keeps
|
|
280
|
+
``kanon search`` consistent with what ``kanon add`` would resolve.
|
|
277
281
|
|
|
278
282
|
Args:
|
|
279
283
|
url: Git repository URL of the catalog manifest repo.
|
|
280
|
-
entry_name: The catalog entry name whose
|
|
284
|
+
entry_name: The catalog entry name whose versions are enumerated.
|
|
281
285
|
|
|
282
286
|
Returns:
|
|
283
287
|
Newest-first list of PEP 440 version strings. Empty when the entry has no
|
|
284
|
-
|
|
288
|
+
namespaced and no bare version tags.
|
|
285
289
|
|
|
286
290
|
Raises:
|
|
287
291
|
SourceUnreachableError: When the underlying ``git ls-remote`` exits
|
|
288
292
|
non-zero or the git binary is missing (the caller decides whether to
|
|
289
293
|
skip+warn or propagate).
|
|
290
294
|
"""
|
|
291
|
-
pattern = f"refs/tags/{entry_name}/*"
|
|
292
295
|
try:
|
|
293
296
|
result = subprocess.run(
|
|
294
|
-
["git", "ls-remote", "--tags", url
|
|
297
|
+
["git", "ls-remote", "--tags", url],
|
|
295
298
|
capture_output=True,
|
|
296
299
|
text=True,
|
|
297
300
|
check=False,
|
|
@@ -302,17 +305,26 @@ def _list_namespaced_version_tags(url: str, entry_name: str) -> list[str]:
|
|
|
302
305
|
if result.returncode != 0:
|
|
303
306
|
raise SourceUnreachableError(url, result.stderr.strip() or f"git ls-remote exited {result.returncode}")
|
|
304
307
|
|
|
305
|
-
|
|
306
|
-
versions: list[Version] = []
|
|
308
|
+
refs: list[str] = []
|
|
307
309
|
for line in result.stdout.splitlines():
|
|
308
310
|
line = line.strip()
|
|
309
311
|
if not line or "\t" not in line:
|
|
310
312
|
continue
|
|
311
313
|
_sha, ref = line.split("\t", 1)
|
|
312
314
|
ref = ref.strip()
|
|
313
|
-
if ref.endswith("^{}") or not ref.startswith(
|
|
315
|
+
if ref.endswith("^{}") or not ref.startswith("refs/tags/"):
|
|
316
|
+
continue
|
|
317
|
+
refs.append(ref)
|
|
318
|
+
|
|
319
|
+
namespace = select_entry_namespace(refs, entry_name)
|
|
320
|
+
prefix = f"refs/tags/{namespace}/" if namespace is not None else "refs/tags/"
|
|
321
|
+
versions: list[Version] = []
|
|
322
|
+
for ref in refs:
|
|
323
|
+
if not ref.startswith(prefix):
|
|
314
324
|
continue
|
|
315
325
|
suffix = ref[len(prefix) :]
|
|
326
|
+
if namespace is None and "/" in suffix:
|
|
327
|
+
continue
|
|
316
328
|
try:
|
|
317
329
|
versions.append(Version(suffix))
|
|
318
330
|
except InvalidVersion:
|