Upload RPMs to local repos. Metadata is parsed async after upload
using cavaliergopher/rpm and stored in rpm_metadata table. Repodata
(repomd.xml, primary.xml.gz, filelists.xml.gz, other.xml.gz) is
generated on-demand from the DB — nothing stored in S3.
- RPM provider implements LocalUploader (validates .rpm extension,
stores under Packages/)
- RPM provider implements PostUploadHook (async goroutine parses RPM
headers, extracts name/version/arch/deps/etc into rpm_metadata)
- RPM provider implements LocalIndexer (serves repodata/* paths by
querying rpm_metadata and generating XML on the fly)
- New provider interfaces: PostUploadHook, BlobReader, MetadataStore,
RPMMetadataReader
- New rpm_metadata table with JSONB columns for requires/provides/
files/changelogs
Tested e2e: upload cowsay RPM → repodata generated → dnf install
from local repo