github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/pkg/steampipeconfig/versionmap/dependency_version_map.go (about) 1 package versionmap 2 3 import ( 4 "sort" 5 6 "github.com/Masterminds/semver/v3" 7 "github.com/turbot/steampipe/pkg/steampipeconfig/modconfig" 8 "github.com/xlab/treeprint" 9 "golang.org/x/exp/maps" 10 ) 11 12 type DependencyVersionMap map[string]ResolvedVersionMap 13 14 // Add adds a dependency to the list of items installed for the given parent 15 func (m DependencyVersionMap) Add(dependencyName, alias string, dependencyVersion *semver.Version, constraintString string, parentName string) { 16 // get the map for this parent 17 parentItems := m[parentName] 18 // create if needed 19 if parentItems == nil { 20 parentItems = make(ResolvedVersionMap) 21 } 22 // add the dependency 23 parentItems.Add(dependencyName, NewResolvedVersionConstraint(dependencyName, alias, dependencyVersion, constraintString)) 24 // save 25 m[parentName] = parentItems 26 } 27 28 // FlatMap converts the DependencyVersionMap into a ResolvedVersionMap, keyed by mod dependency path 29 func (m DependencyVersionMap) FlatMap() ResolvedVersionMap { 30 res := make(ResolvedVersionMap) 31 for _, deps := range m { 32 for _, dep := range deps { 33 res[modconfig.BuildModDependencyPath(dep.Name, dep.Version)] = dep 34 } 35 } 36 return res 37 } 38 39 func (m DependencyVersionMap) GetDependencyTree(rootName string) treeprint.Tree { 40 tree := treeprint.NewWithRoot(rootName) 41 m.buildTree(rootName, tree) 42 return tree 43 } 44 45 func (m DependencyVersionMap) buildTree(name string, tree treeprint.Tree) { 46 deps := m[name] 47 depNames := maps.Keys(deps) 48 sort.Strings(depNames) 49 for _, name := range depNames { 50 version := deps[name] 51 fullName := modconfig.BuildModDependencyPath(name, version.Version) 52 child := tree.AddBranch(fullName) 53 // if there are children add them 54 m.buildTree(fullName, child) 55 } 56 } 57 58 // GetMissingFromOther returns a map of dependencies which exit in this map but not 'other' 59 func (m DependencyVersionMap) GetMissingFromOther(other DependencyVersionMap) DependencyVersionMap { 60 res := make(DependencyVersionMap) 61 for parent, deps := range m { 62 otherDeps := other[parent] 63 if otherDeps == nil { 64 otherDeps = make(ResolvedVersionMap) 65 } 66 for name, dep := range deps { 67 if _, ok := otherDeps[name]; !ok { 68 res.Add(dep.Name, dep.Alias, dep.Version, dep.Constraint, parent) 69 } 70 } 71 } 72 return res 73 } 74 75 func (m DependencyVersionMap) GetUpgradedInOther(other DependencyVersionMap) DependencyVersionMap { 76 res := make(DependencyVersionMap) 77 for parent, deps := range m { 78 otherDeps := other[parent] 79 if otherDeps == nil { 80 otherDeps = make(ResolvedVersionMap) 81 } 82 for name, dep := range deps { 83 if otherDep, ok := otherDeps[name]; ok { 84 if otherDep.Version.GreaterThan(dep.Version) { 85 res.Add(otherDep.Name, dep.Alias, otherDep.Version, otherDep.Constraint, parent) 86 } 87 } 88 } 89 } 90 return res 91 } 92 93 func (m DependencyVersionMap) GetDowngradedInOther(other DependencyVersionMap) DependencyVersionMap { 94 res := make(DependencyVersionMap) 95 for parent, deps := range m { 96 otherDeps := other[parent] 97 if otherDeps == nil { 98 otherDeps = make(ResolvedVersionMap) 99 } 100 for name, dep := range deps { 101 if otherDep, ok := otherDeps[name]; ok { 102 if otherDep.Version.LessThan(dep.Version) { 103 res.Add(otherDep.Name, dep.Alias, otherDep.Version, otherDep.Constraint, parent) 104 } 105 } 106 } 107 } 108 return res 109 }