79bf0de110
The virtual engine now detects local members (repo_type=local) and generates their package index in-memory instead of trying to fetch from a non-existent upstream. - MemberIndex gains RepoType field so mergers use correct URL prefix (/api/v1/local/ vs /api/v1/remote/) - Virtual engine accepts a LocalIndexGenerator interface for producing local PyPI indexes - LocalHandler implements GeneratePyPIPackageHTML for reuse by both the direct serving path and the virtual merger - Includes local PyPI upload support (cherry-picked from benvin/local-pypi) Tested e2e: local wheel upload + virtual merge + uv pip install from both direct local and virtual URLs
32 lines
602 B
Go
32 lines
602 B
Go
package virtual
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.unkin.net/unkin/artifactapi/pkg/models"
|
|
)
|
|
|
|
type MemberIndex struct {
|
|
RemoteName string
|
|
RepoType models.RepoType
|
|
Body []byte
|
|
}
|
|
|
|
type IndexMerger interface {
|
|
MergeIndexes(members []MemberIndex, proxyBaseURL string) ([]byte, error)
|
|
}
|
|
|
|
var mergers = map[models.PackageType]IndexMerger{}
|
|
|
|
func RegisterMerger(pt models.PackageType, m IndexMerger) {
|
|
mergers[pt] = m
|
|
}
|
|
|
|
func GetMerger(pt models.PackageType) (IndexMerger, error) {
|
|
m, ok := mergers[pt]
|
|
if !ok {
|
|
return nil, fmt.Errorf("no merger registered for package type %q", pt)
|
|
}
|
|
return m, nil
|
|
}
|