-
released this
2026-06-23 22:56:25 +10:00 Summary
Move package-type-specific local repo logic out of centralized handlers into provider packages via optional Go interfaces.
New interfaces in
providerpackage:- `LocalUploader`: `ValidateUpload(filePath) → (storagePath, contentType, error)` + `UploadResponse(...)`
- `LocalIndexer`: `ServeLocalIndex(w, r, files, repoName, path) → bool` + `GenerateLocalIndex(ctx, files, repoName, path) → ([]byte, error)`
- `FileStore`: `ListFilesByPrefix` + `ListPackages` (implemented by database.DB)
Providers implement these interfaces:
- PyPI: upload validation (wheel/sdist naming), simple index serving + generation
- Terraform: upload validation (provider zip naming), mirror protocol serving
Handlers simplified to generic dispatch:
- `local.go`: type-asserts to `LocalUploader`, falls back to generic upload
- `proxy.go`: type-asserts to `LocalIndexer`, falls back to raw file serving
- `engine.go`: type-asserts to `LocalIndexer` for local virtual members
Adding a new local repo type (e.g. RPM) = implement the interfaces in its provider package. Zero handler changes.
Test plan
- Build + unit tests pass
- E2E: PyPI local upload → simple index → uv pip install (smoke test after refactor)
Reviewed-on: #52
Co-authored-by: Ben Vincent ben@unkin.net
Co-committed-by: Ben Vincent ben@unkin.netDownloads