aur.go 1.9 KB

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