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  }