github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/internal/relationship/sort.go (about) 1 package relationship 2 3 import ( 4 "sort" 5 6 "github.com/anchore/syft/syft/artifact" 7 "github.com/anchore/syft/syft/pkg" 8 ) 9 10 // Sort takes a set of package-to-package relationships and sorts them in a stable order by name and version. 11 // Note: this does not consider package-to-other, other-to-package, or other-to-other relationships. 12 // TODO: ideally this should be replaced with a more type-agnostic sort function that resides in the artifact package. 13 func Sort(rels []artifact.Relationship) { 14 sort.SliceStable(rels, func(i, j int) bool { 15 return less(rels[i], rels[j]) 16 }) 17 } 18 19 func less(i, j artifact.Relationship) bool { 20 iFrom, ok1 := i.From.(pkg.Package) 21 iTo, ok2 := i.To.(pkg.Package) 22 jFrom, ok3 := j.From.(pkg.Package) 23 jTo, ok4 := j.To.(pkg.Package) 24 25 if !(ok1 && ok2 && ok3 && ok4) { 26 return false 27 } 28 29 if iFrom.Name != jFrom.Name { 30 return iFrom.Name < jFrom.Name 31 } 32 if iFrom.Version != jFrom.Version { 33 return iFrom.Version < jFrom.Version 34 } 35 if iTo.Name != jTo.Name { 36 return iTo.Name < jTo.Name 37 } 38 if iTo.Version != jTo.Version { 39 return iTo.Version < jTo.Version 40 } 41 return i.Type < j.Type 42 }