metadata_downloader.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package metadata
  2. import (
  3. "fmt"
  4. "io"
  5. "net/http"
  6. "os"
  7. )
  8. func MakeOrReadCache(cachePath string) ([]byte, error) {
  9. cacheBytes, err := ReadCache(cachePath)
  10. if err != nil {
  11. return nil, err
  12. }
  13. if len(cacheBytes) == 0 {
  14. cacheBytes, err = MakeCache(cachePath)
  15. if err != nil {
  16. return nil, err
  17. }
  18. }
  19. return cacheBytes, nil
  20. }
  21. func ReadCache(cachePath string) ([]byte, error) {
  22. fp, err := os.Open(cachePath)
  23. if err != nil {
  24. if os.IsNotExist(err) {
  25. return nil, nil
  26. }
  27. return nil, err
  28. }
  29. defer fp.Close()
  30. s, err := io.ReadAll(fp)
  31. if err != nil {
  32. return nil, err
  33. }
  34. return s, nil
  35. }
  36. // Download the metadata for aur packages.
  37. // create cache file
  38. // write to cache file
  39. func MakeCache(cachePath string) ([]byte, error) {
  40. body, err := downloadAURMetadata()
  41. if err != nil {
  42. return nil, err
  43. }
  44. defer body.Close()
  45. s, err := io.ReadAll(body)
  46. if err != nil {
  47. return nil, err
  48. }
  49. f, err := os.Create(cachePath)
  50. if err != nil {
  51. return nil, err
  52. }
  53. defer f.Close()
  54. if _, err = f.Write(s); err != nil {
  55. return nil, err
  56. }
  57. return s, err
  58. }
  59. func downloadAURMetadata() (io.ReadCloser, error) {
  60. resp, err := http.Get("https://aur.archlinux.org/packages-meta-ext-v1.json.gz")
  61. if err != nil {
  62. return nil, err
  63. }
  64. if resp.StatusCode != http.StatusOK {
  65. return nil, fmt.Errorf("failed to download metadata: %s", resp.Status)
  66. }
  67. return resp.Body, nil
  68. }