• v3.4.0 3a6721c2a7

    refactor: modular local provider interfaces (#52)
    ci/woodpecker/tag/docker Pipeline was successful

    unkinben 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 provider package:

    • `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.net

    Downloads