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  }