github.com/jfrog/jfrog-cli-go@v1.22.1-0.20200318093948-4826ef344ffd/artifactory/utils/nuget/dependencies/dependencies.go (about) 1 package dependencies 2 3 import ( 4 "fmt" 5 deptree "github.com/jfrog/jfrog-cli-go/artifactory/utils/dependenciestree" 6 "github.com/jfrog/jfrog-client-go/artifactory/buildinfo" 7 "github.com/jfrog/jfrog-client-go/utils/log" 8 ) 9 10 var extractors []Extractor 11 12 // Register dependency extractor 13 func register(dependencyType Extractor) { 14 extractors = append(extractors, dependencyType) 15 } 16 17 // The extractor responsible to calculate the project dependencies. 18 type Extractor interface { 19 // Check whether the extractor is compatible with the current dependency resolution method 20 IsCompatible(projectName, projectRoot string) (bool, error) 21 // Get all the dependencies for the project 22 AllDependencies() (map[string]*buildinfo.Dependency, error) 23 // Get all the root dependencies of the project 24 DirectDependencies() ([]string, error) 25 // Dependencies relations map 26 ChildrenMap() (map[string][]string, error) 27 28 new(projectName, projectRoot string) (Extractor, error) 29 } 30 31 func CreateCompatibleExtractor(projectName, projectRoot string) (Extractor, error) { 32 extractor, err := getCompatibleExtractor(projectName, projectRoot) 33 if err != nil { 34 return nil, err 35 } 36 return extractor, nil 37 } 38 39 func CreateDependencyTree(extractor Extractor) (deptree.Root, error) { 40 rootDependencies, err := extractor.DirectDependencies() 41 if err != nil { 42 return nil, err 43 } 44 allDependencies, err := extractor.AllDependencies() 45 if err != nil { 46 return nil, err 47 } 48 childrenMap, err := extractor.ChildrenMap() 49 if err != nil { 50 return nil, err 51 } 52 return deptree.CreateDependencyTree(rootDependencies, allDependencies, childrenMap), nil 53 } 54 55 // Find suitable registered dependencies extractor. 56 func getCompatibleExtractor(projectName, projectRoot string) (Extractor, error) { 57 for _, extractor := range extractors { 58 compatible, err := extractor.IsCompatible(projectName, projectRoot) 59 if err != nil { 60 return nil, err 61 } 62 if compatible { 63 return extractor.new(projectName, projectRoot) 64 } 65 } 66 log.Debug(fmt.Sprintf("Unsupported project dependencies for project: %s", projectName)) 67 return nil, nil 68 }