package bulk import ( "sort" "tangled.org/odd.computer/isomorph/internal/distro" "tangled.org/odd.computer/isomorph/internal/distro/alpine" "tangled.org/odd.computer/isomorph/internal/model" ) // FromAlpine builds one row per origin (source package) of the edge APKINDEX of each section. // The APKINDEX supplies the built version, url and binary names; the origin's APKBUILD (keyed // "
/") supplies the source URLs. OSV defines Alpine ecosystems per release // (Alpine:v3.22), not for edge, so OSVEcosystem stays empty for these rows. func FromAlpine(index map[string][]alpine.IndexEntry, apkbuilds map[string]*alpine.APKBUILD) []Package { var out []Package for _, section := range sortedKeys(index) { type origin struct { version, url string bins []string } origins := map[string]*origin{} for _, e := range index[section] { name := e.Origin if name == "" { name = e.Name } o := origins[name] if o == nil { o = &origin{version: e.Version, url: e.URL} origins[name] = o } o.bins = append(o.bins, e.Name) } for _, name := range sortedKeys(origins) { o := origins[name] p := Package{Distro: model.Alpine, Suite: "edge-" + section, Name: name, Version: o.version, Binaries: dedupe(o.bins), Homepage: o.url, Status: StatusUnresolved} if ab := apkbuilds[section+"/"+name]; ab != nil { if ab.URL != "" { p.Homepage = ab.URL } fill(&p, distro.RankCandidates(alpine.Candidates(ab))) } else if o.url != "" { fill(&p, distro.RankCandidates(distro.AddCandidate(nil, o.url, model.Evidence{Source: "APKINDEX:url", Value: o.url, Weight: 0.5}))) } out = append(out, p) } } return out } func sortedKeys[V any](m map[string]V) []string { out := make([]string, 0, len(m)) for k := range m { out = append(out, k) } sort.Strings(out) return out }