abs.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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/v12/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,
  71. ) (bool, error) {
  72. pkgURL, err := getPackageRepoURL(dbName)
  73. if err != nil {
  74. return false, err
  75. }
  76. return downloadGitRepo(ctx, cmdBuilder, pkgURL,
  77. pkgName, dest, force, "--single-branch", "-b", "packages/"+pkgName)
  78. }