github.com/jfrog/jfrog-cli-core/v2@v2.51.0/artifactory/commands/python/dependencies/cache.go (about)

     1  package dependencies
     2  
     3  import (
     4  	"encoding/json"
     5  	buildinfo "github.com/jfrog/build-info-go/entities"
     6  	ioutils "github.com/jfrog/gofrog/io"
     7  	"github.com/jfrog/jfrog-client-go/utils/errorutils"
     8  	"github.com/jfrog/jfrog-client-go/utils/io/fileutils"
     9  	"io"
    10  	"os"
    11  	"path/filepath"
    12  )
    13  
    14  const cacheLatestVersion = 1
    15  
    16  type DependenciesCache struct {
    17  	Version int                             `json:"version,omitempty"`
    18  	DepsMap map[string]buildinfo.Dependency `json:"dependencies,omitempty"`
    19  }
    20  
    21  // Reads the json cache file of recent used project's dependencies,  and converts it into a map of
    22  // Key: dependency_name Value: dependency's struct with all relevant information.
    23  // If cache file does not exist -> return nil, nil.
    24  // If error occurred, return error.
    25  func GetProjectDependenciesCache(cacheDir string) (cache *DependenciesCache, err error) {
    26  	cache = new(DependenciesCache)
    27  	cacheFilePath, exists, err := getCacheFilePath(cacheDir)
    28  	if errorutils.CheckError(err) != nil || !exists {
    29  		return nil, err
    30  	}
    31  	jsonFile, err := os.Open(cacheFilePath)
    32  	if errorutils.CheckError(err) != nil {
    33  		return nil, err
    34  	}
    35  	defer ioutils.Close(jsonFile, &err)
    36  	byteValue, err := io.ReadAll(jsonFile)
    37  	if errorutils.CheckError(err) != nil {
    38  		return nil, err
    39  	}
    40  	err = json.Unmarshal(byteValue, cache)
    41  	if errorutils.CheckError(err) != nil {
    42  		return nil, err
    43  	}
    44  	return
    45  }
    46  
    47  // Receives map of all current project's dependencies information.
    48  // The map contains the dependencies retrieved from Artifactory as well as those read from cache.
    49  // Writes the updated project's dependencies cache with all current dependencies.
    50  func UpdateDependenciesCache(updatedMap map[string]buildinfo.Dependency, cacheDir string) (err error) {
    51  	updatedCache := DependenciesCache{Version: cacheLatestVersion, DepsMap: updatedMap}
    52  	content, err := json.Marshal(&updatedCache)
    53  	if err != nil {
    54  		return errorutils.CheckError(err)
    55  	}
    56  	cacheFilePath, _, err := getCacheFilePath(cacheDir)
    57  	if err != nil {
    58  		return errorutils.CheckError(err)
    59  	}
    60  
    61  	cacheFile, err := os.Create(cacheFilePath)
    62  	if err != nil {
    63  		return errorutils.CheckError(err)
    64  	}
    65  	defer ioutils.Close(cacheFile, &err)
    66  	_, err = cacheFile.Write(content)
    67  	if err != nil {
    68  		return errorutils.CheckError(err)
    69  	}
    70  	return
    71  }
    72  
    73  // Return required dependency from cache.
    74  // If dependency does not exist, return nil.
    75  // dependencyName - Name of dependency (lowercase package name).
    76  func (cache DependenciesCache) GetDependency(dependencyName string) (dependency buildinfo.Dependency) {
    77  	dependency = cache.DepsMap[dependencyName]
    78  	return
    79  }
    80  
    81  // Cache file will be located in the ./.jfrog/projects/deps.cache.json
    82  func getCacheFilePath(cacheDir string) (cacheFilePath string, exists bool, err error) {
    83  	projectsDirPath := filepath.Join(cacheDir, ".jfrog", "projects")
    84  	err = fileutils.CreateDirIfNotExist(projectsDirPath)
    85  	if err != nil {
    86  		return
    87  	}
    88  	cacheFilePath = filepath.Join(projectsDirPath, "deps.cache.json")
    89  	exists, err = fileutils.IsFileExists(cacheFilePath, false)
    90  	return
    91  }