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 }