aur.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package download
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "net/url"
  8. "sync"
  9. "github.com/leonelquinteros/gotext"
  10. "github.com/Jguer/yay/v12/pkg/multierror"
  11. "github.com/Jguer/yay/v12/pkg/settings/exe"
  12. "github.com/Jguer/yay/v12/pkg/text"
  13. )
  14. func AURPKGBUILD(httpClient httpRequestDoer, pkgName, aurURL string) ([]byte, error) {
  15. values := url.Values{}
  16. values.Set("h", pkgName)
  17. pkgURL := aurURL + "/cgit/aur.git/plain/PKGBUILD?" + values.Encode()
  18. resp, err := httpClient.Get(pkgURL)
  19. if err != nil {
  20. return nil, err
  21. }
  22. if resp.StatusCode != http.StatusOK {
  23. return nil, ErrAURPackageNotFound{pkgName: pkgName}
  24. }
  25. defer resp.Body.Close()
  26. pkgBuild, err := io.ReadAll(resp.Body)
  27. if err != nil {
  28. return nil, err
  29. }
  30. return pkgBuild, nil
  31. }
  32. // AURPkgbuildRepo retrieves the PKGBUILD repository to a dest directory.
  33. func AURPKGBUILDRepo(ctx context.Context, cmdBuilder exe.GitCmdBuilder, aurURL, pkgName, dest string, force bool) (bool, error) {
  34. pkgURL := fmt.Sprintf("%s/%s.git", aurURL, pkgName)
  35. return downloadGitRepo(ctx, cmdBuilder, pkgURL, pkgName, dest, force)
  36. }
  37. func AURPKGBUILDRepos(
  38. ctx context.Context,
  39. cmdBuilder exe.GitCmdBuilder, logger *text.Logger,
  40. targets []string, aurURL, dest string, force bool,
  41. ) (map[string]bool, error) {
  42. cloned := make(map[string]bool, len(targets))
  43. var (
  44. mux sync.Mutex
  45. errs multierror.MultiError
  46. wg sync.WaitGroup
  47. )
  48. sem := make(chan uint8, MaxConcurrentFetch)
  49. for _, target := range targets {
  50. sem <- 1
  51. wg.Add(1)
  52. go func(target string) {
  53. defer func() {
  54. <-sem
  55. wg.Done()
  56. }()
  57. newClone, err := AURPKGBUILDRepo(ctx, cmdBuilder, aurURL, target, dest, force)
  58. mux.Lock()
  59. progress := len(cloned)
  60. if err != nil {
  61. errs.Add(err)
  62. mux.Unlock()
  63. logger.OperationInfoln(
  64. gotext.Get("(%d/%d) Failed to download PKGBUILD: %s",
  65. progress, len(targets), text.Cyan(target)))
  66. return
  67. }
  68. cloned[target] = newClone
  69. progress = len(cloned)
  70. mux.Unlock()
  71. logger.OperationInfoln(
  72. gotext.Get("(%d/%d) Downloaded PKGBUILD: %s",
  73. progress, len(targets), text.Cyan(target)))
  74. }(target)
  75. }
  76. wg.Wait()
  77. return cloned, errs.Return()
  78. }