abs.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package download
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. "github.com/leonelquinteros/gotext"
  9. "github.com/Jguer/yay/v11/pkg/settings/exe"
  10. )
  11. const (
  12. MaxConcurrentFetch = 20
  13. _urlPackagePath = "%s/raw/packages/%s/trunk/PKGBUILD"
  14. )
  15. var (
  16. ErrInvalidRepository = errors.New(gotext.Get("invalid repository"))
  17. ErrABSPackageNotFound = errors.New(gotext.Get("package not found in repos"))
  18. ABSPackageURL = "https://github.com/archlinux/svntogit-packages"
  19. ABSCommunityURL = "https://github.com/archlinux/svntogit-community"
  20. )
  21. func getRepoURL(db string) (string, error) {
  22. switch db {
  23. case "core", "extra", "testing":
  24. return ABSPackageURL, nil
  25. case "community", "multilib", "community-testing", "multilib-testing":
  26. return ABSCommunityURL, nil
  27. }
  28. return "", ErrInvalidRepository
  29. }
  30. // Return format for pkgbuild
  31. // https://github.com/archlinux/svntogit-community/raw/packages/neovim/trunk/PKGBUILD
  32. func getPackageURL(db, pkgName string) (string, error) {
  33. repoURL, err := getRepoURL(db)
  34. if err != nil {
  35. return "", err
  36. }
  37. return fmt.Sprintf(_urlPackagePath, repoURL, pkgName), err
  38. }
  39. // Return format for pkgbuild repo
  40. // https://github.com/archlinux/svntogit-community.git
  41. func getPackageRepoURL(db string) (string, error) {
  42. repoURL, err := getRepoURL(db)
  43. if err != nil {
  44. return "", err
  45. }
  46. return repoURL + ".git", err
  47. }
  48. // ABSPKGBUILD retrieves the PKGBUILD file to a dest directory.
  49. func ABSPKGBUILD(httpClient httpRequestDoer, dbName, pkgName string) ([]byte, error) {
  50. packageURL, err := getPackageURL(dbName, pkgName)
  51. if err != nil {
  52. return nil, err
  53. }
  54. resp, err := httpClient.Get(packageURL)
  55. if err != nil {
  56. return nil, err
  57. }
  58. if resp.StatusCode != http.StatusOK {
  59. return nil, ErrABSPackageNotFound
  60. }
  61. defer resp.Body.Close()
  62. pkgBuild, err := io.ReadAll(resp.Body)
  63. if err != nil {
  64. return nil, err
  65. }
  66. return pkgBuild, nil
  67. }
  68. // ABSPKGBUILDRepo retrieves the PKGBUILD repository to a dest directory.
  69. func ABSPKGBUILDRepo(ctx context.Context, cmdBuilder exe.GitCmdBuilder,
  70. dbName, pkgName, dest string, force bool) (bool, error) {
  71. pkgURL, err := getPackageRepoURL(dbName)
  72. if err != nil {
  73. return false, err
  74. }
  75. return downloadGitRepo(ctx, cmdBuilder, pkgURL,
  76. pkgName, dest, force, "--single-branch", "-b", "packages/"+pkgName)
  77. }