Metadata-Version: 2.4
Name: svnpypi
Version: 0.2.2
Summary: SVN-backed Python package registry
Project-URL: Homepage, https://github.com/narutozb/svnpypi
Project-URL: Documentation, https://github.com/narutozb/svnpypi/tree/main/docs
Project-URL: Repository, https://github.com/narutozb/svnpypi.git
Project-URL: Issues, https://github.com/narutozb/svnpypi/issues
Author: yuanzhen qiao
License: MIT
License-File: LICENSE
Requires-Python: >=3.9
Requires-Dist: packaging>=23.2
Requires-Dist: pysvnlite<0.3,>=0.2.2
Requires-Dist: tomli>=2.0.1; python_version < '3.11'
Provides-Extra: dev
Requires-Dist: build>=1.2; extra == 'dev'
Requires-Dist: mypy<2.0,>=1.11; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: ruff>=0.6; extra == 'dev'
Provides-Extra: release
Requires-Dist: build>=1.2; extra == 'release'
Requires-Dist: twine>=5.1; extra == 'release'
Description-Content-Type: text/markdown

# svnpypi

基于 SVN 的轻量 Python 内部包分发 CLI。复用现有 SVN 认证和权限，完成 wheel / sdist 的上传、查询、下载、SHA256 校验和 pip 安装，无需新增包服务器。

当前版本：**0.2.2**。修复并发上传清单丢失、SVN 超时、仓库 URL 参数注入及非包目录过滤。

## 安装与升级

要求 Python >=3.9、pip 和 PATH 中可用的原生 `svn`。生产请选择[仍受官方维护的 Python](https://devguide.python.org/versions/)。推荐在新的虚拟环境安装，避免影响其他项目。

Windows PowerShell：

```powershell
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install "svnpypi==0.2.2"
.\.venv\Scripts\svnpypi.exe --help
```

Linux / macOS：

```bash
python3 -m venv .venv
.venv/bin/python -m pip install "svnpypi==0.2.2"
.venv/bin/svnpypi --help
```

**旧 `svnpypi<=0.1.7` 不要直接普通升级。** 旧包捆绑的 `pysvnlite/` 文件会与独立包冲突，pip 卸载旧包时可能删除新库。已发生导入失败、或需要原地迁移时，按[安装与升级指南](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/installation.md)先卸载再安装。仅 `pip check` 不能证明文件完整。

`svnpypi` 从 0.2.0 起仅包含 CLI，当前通过 `pysvnlite>=0.2.2,<0.3` 使用[独立 SVN API](https://github.com/narutozb/pysvnlite)。仅需 Python SVN API 时直接安装 `pysvnlite`。离线部署须携带完整依赖 wheel，不能只复制 svnpypi wheel。

## 最小工作流

先激活上面的环境。将示例 URL 替换为团队测试通道；上传和写探针会修改远端 SVN，只对授权目录操作。

```bash
svnpypi doctor --repo-url svn+ssh://svn.company.com/python-packages/test
svnpypi upload dist/* --repo-url svn+ssh://svn.company.com/python-packages/test
svnpypi list --repo-url svn+ssh://svn.company.com/python-packages/test
svnpypi install my-internal-tool --version 1.2.3 --repo-url svn+ssh://svn.company.com/python-packages/test --require-hash --record .svnpypi/install.json
```

`dist/` 应只保留本次要上传的制品，或显式传入文件名。业务验证通过后，将**同一批构建产物**上传至 `release`。不要重新构建或覆盖同名不同内容的制品。

| 命令 | 用途 |
| --- | --- |
| `doctor` | 检查 SVN、pip 和仓库访问；`--check-write` 会创建并删除远端临时目录 |
| `upload` | 上传标准 wheel / sdist，维护 `SHA256SUMS` |
| `list` | 列出包与版本 |
| `install` | 选择兼容制品，下载校验后调用当前 Python 的 pip |
| `sync` | 读取 `[tool.svnpypi]` 并调用 install，不实现依赖解析器 |

`--json` 供自动化读取，`--pip-args` 后的参数原样交给 pip，须放在命令末尾。默认仓库地址可用 `SVNPYPI_REPO_URL` 设置。完整选项与错误边界见[命令参考](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/command-reference.md)。

## 使用边界

- 只管理 Python wheel / sdist，不提供 Web 服务、通用文件镜像或完整 PyPI 协议。
- SVN 负责认证、ACL、审计与备份。不要将密码写入 URL、命令行或日志。
- 同名制品仅在 SHA256 相同时跳过；不同内容拒绝覆盖。多包上传不是跨包原子事务。
- `SHA256SUMS` 证明内容一致性，不是签名；`--record` 是单次安装证据，不是完整依赖锁文件。
- `install` 只从 SVN 获取所选制品，其依赖仍由 pip 解析；离线时须准备全部依赖。
- 临时文件使用操作系统临时目录。部分 Windows / TortoiseSVN 构建无法正确处理中文绝对路径；检出后检查能识别虚假成功，但不会修复原生编码。详见[平台验证与限制](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/platform-verification-matrix.md)。
- SVN、pip 和远端认证组合需在部署环境验收；发布成功不代表所有平台已验证。`--timeout SECONDS` / `SVNPYPI_TIMEOUT` 默认每个 SVN 命令 300 秒，0 为不限时；这不是整个任务或 pip 安装的总时限，CI 仍应设置作业总时限。
- 仓库 URL 只接受 `http/https/svn/svn+ssh/file`，禁止账号密码、查询参数、片段和空白。认证通过 SVN 缓存或 SSH agent 配置；仅在信任的项目中执行 `sync`，它会读取项目配置并安装代码。
- 完整超时清理要求 `pysvnlite>=0.2.2,<0.3`，安装本版会按依赖下限更新底层库；详见[变更日志](CHANGELOG.md)。旧 0.2.1 及以下版本需升级才能获得本轮修复。

## 文档入口

- [文档中心](https://github.com/narutozb/svnpypi/blob/main/docs/README.md)：按使用、部署和维护任务导航。
- [安装与升级](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/installation.md)、[离线 / SVN 首装](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/bootstrap-install.md)。
- [稳定使用](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/stable-usage-guide.md)、[部署验收](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/deployment-readiness.md)。
- [独立拆包说明](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/package-split.md)、[项目自身的 PyPI 发布](https://github.com/narutozb/svnpypi/blob/main/docs/svnpypi/pypi-release.md)。
- [路线图](https://github.com/narutozb/svnpypi/blob/main/ROADMAP.md)、[中文变更日志](https://github.com/narutozb/svnpypi/blob/main/CHANGELOG.md)。

## 开发验证

在仓库根目录、已激活的开发虚拟环境执行：

```bash
python -m pip install -e ".[dev,release]"
python -m ruff check src tests scripts
python -m mypy src scripts
python -m pytest -q
python scripts/release_pypi.py
```

发布脚本默认只检查和构建，不上传；生产上传需要干净工作区、完整检查和已原样推送的 annotated tag。wheel / sdist 不包含 AI 文件、测试、CI、发布脚本或 pysvnlite 源码。测试仅向临时 `file://` SVN 仓库写入。
