github.com/jfrog/jfrog-cli-core@v1.12.1/artifactory/utils/dotnet/dependencies/dependencies.go (about)

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