github.com/replit/upm@v0.0.0-20240423230255-9ce4fc3ea24c/internal/backends/python/gen_pypi_map/package_info.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 "sort" 8 "strings" 9 ) 10 11 // func loadPackageInfo(packageName string, cacheDir string, cached *PackageInfo) error { 12 // filePath := cacheDir + "/" + packageName + ".json" 13 // return loadPackageInfoFile(filePath, cached) 14 // } 15 16 func LoadPackageInfoFile(filePath string, cached *PackageInfo) error { 17 file, err := os.Open(filePath) 18 if err != nil { 19 return err 20 } 21 decoder := json.NewDecoder(file) 22 err = decoder.Decode(cached) 23 if err != nil { 24 return err 25 } 26 defer file.Close() 27 return nil 28 } 29 30 func SavePackageInfo(packageName string, cacheDir string, info *PackageInfo) error { 31 err := os.MkdirAll(cacheDir, 0o774) 32 33 if err != nil { 34 return err 35 } 36 filePath := cacheDir + "/" + packageName + ".json" 37 writer, err := os.Create(filePath) 38 if err != nil { 39 return err 40 } 41 defer writer.Close() 42 43 cacheEncoder := json.NewEncoder(writer) 44 cacheEncoder.SetIndent("", " ") 45 err = cacheEncoder.Encode(&info) 46 fmt.Printf("Wrote %s\n", filePath) 47 if err != nil { 48 return err 49 } 50 return nil 51 } 52 53 func LoadAllPackageInfo(cacheDir string, cacheFilePath string) map[string]PackageInfo { 54 registry := make(map[string]PackageInfo) 55 56 file, err := os.Open(cacheFilePath) 57 58 if err == nil { 59 decoder := json.NewDecoder(file) 60 for decoder.More() { 61 var info PackageInfo 62 err = decoder.Decode(&info) 63 if err != nil { 64 panic(err) 65 } 66 67 registry[strings.ToLower(info.Name)] = info 68 } 69 70 file.Close() 71 } 72 73 entries, err := os.ReadDir(cacheDir) 74 75 if err != nil { 76 return registry 77 } 78 79 for _, entry := range entries { 80 var info PackageInfo 81 filePath := cacheDir + "/" + entry.Name() 82 err := LoadPackageInfoFile(filePath, &info) 83 if err != nil { 84 continue 85 } 86 registry[strings.ToLower(info.Name)] = info 87 } 88 89 return registry 90 } 91 92 /* 93 Merge files in the cache directory into the cache file 94 */ 95 func UpdateAllPackageInfo(cacheDir string, cacheFilePath string) error { 96 registry := LoadAllPackageInfo(cacheDir, cacheFilePath) 97 98 keys := make([]string, len(registry)) 99 i := 0 100 for key := range registry { 101 keys[i] = key 102 i++ 103 } 104 105 sort.Strings(keys) 106 107 cacheFile, err := os.Create(cacheFilePath) 108 109 if err != nil { 110 return err 111 } 112 113 encoder := json.NewEncoder(cacheFile) 114 115 for _, key := range keys { 116 err = encoder.Encode(registry[key]) 117 if err != nil { 118 return err 119 } 120 } 121 122 cacheFile.Close() 123 124 fmt.Printf("Wrote %s\n", cacheFilePath) 125 126 return nil 127 }