unified.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package download
  2. import (
  3. "net/http"
  4. "sync"
  5. "github.com/Jguer/yay/v10/pkg/db"
  6. "github.com/Jguer/yay/v10/pkg/multierror"
  7. "github.com/Jguer/yay/v10/pkg/settings"
  8. "github.com/Jguer/yay/v10/pkg/text"
  9. )
  10. func getURLName(pkg db.IPackage) string {
  11. name := pkg.Base()
  12. if name == "" {
  13. name = pkg.Name()
  14. }
  15. return name
  16. }
  17. func GetPkgbuilds(dbExecutor db.Executor, httpClient *http.Client, targets []string, mode settings.TargetMode) (map[string][]byte, error) {
  18. pkgbuilds := make(map[string][]byte, len(targets))
  19. var mux sync.Mutex
  20. var errs multierror.MultiError
  21. var wg sync.WaitGroup
  22. sem := make(chan uint8, MaxConcurrentFetch)
  23. for _, target := range targets {
  24. aur := true
  25. dbName, name := text.SplitDBFromName(target)
  26. if dbName != "aur" && (mode == settings.ModeAny || mode == settings.ModeRepo) {
  27. if pkg := dbExecutor.SyncPackage(name); pkg != nil {
  28. aur = false
  29. name = getURLName(pkg)
  30. dbName = pkg.DB().Name()
  31. }
  32. }
  33. if aur && mode == settings.ModeRepo {
  34. // Mode does not allow AUR packages
  35. continue
  36. }
  37. sem <- 1
  38. wg.Add(1)
  39. go func(target, dbName, pkgName string, aur bool) {
  40. var err error
  41. var pkgbuild []byte
  42. if aur {
  43. pkgbuild, err = GetAURPkgbuild(httpClient, pkgName)
  44. } else {
  45. pkgbuild, err = GetABSPkgbuild(httpClient, dbName, pkgName)
  46. }
  47. if err == nil {
  48. mux.Lock()
  49. pkgbuilds[target] = pkgbuild
  50. mux.Unlock()
  51. } else {
  52. errs.Add(err)
  53. }
  54. <-sem
  55. wg.Done()
  56. }(target, dbName, name, aur)
  57. }
  58. wg.Wait()
  59. return pkgbuilds, errs.Return()
  60. }