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  }