aur.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. var AURPackageURL = "https://aur.archlinux.org/cgit/aur.git"
  14. func AURPKGBUILD(httpClient *http.Client, pkgName string) ([]byte, error) {
  15. values := url.Values{}
  16. values.Set("h", pkgName)
  17. pkgURL := AURPackageURL + "/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 := ioutil.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(cmdRunner exe.Runner, cmdBuilder exe.GitCmdBuilder, aurURL, pkgName, dest string, force bool) error {
  34. pkgURL := fmt.Sprintf("%s/%s.git", aurURL, pkgName)
  35. return downloadGitRepo(cmdRunner, cmdBuilder, pkgURL, pkgName, dest, force)
  36. }
  37. func AURPKGBUILDRepos(
  38. cmdRunner exe.Runner,
  39. cmdBuilder exe.GitCmdBuilder,
  40. targets []string, aurURL, dest string, force bool) (map[string]bool, error) {
  41. cloned := make(map[string]bool, len(targets))
  42. var (
  43. mux sync.Mutex
  44. errs multierror.MultiError
  45. wg sync.WaitGroup
  46. )
  47. sem := make(chan uint8, MaxConcurrentFetch)
  48. for _, target := range targets {
  49. sem <- 1
  50. wg.Add(1)
  51. go func(target string) {
  52. err := AURPKGBUILDRepo(cmdRunner, cmdBuilder, aurURL, target, dest, force)
  53. success := err == nil
  54. if success {
  55. mux.Lock()
  56. cloned[target] = success
  57. mux.Unlock()
  58. } else {
  59. errs.Add(err)
  60. }
  61. text.OperationInfoln(
  62. gotext.Get("(%d/%d) Downloaded PKGBUILD: %s",
  63. len(cloned), len(targets), text.Cyan(target)))
  64. <-sem
  65. wg.Done()
  66. }(target)
  67. }
  68. wg.Wait()
  69. return cloned, errs.Return()
  70. }