pkg_archive.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package build
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "github.com/leonelquinteros/gotext"
  10. "github.com/Jguer/yay/v12/pkg/settings"
  11. "github.com/Jguer/yay/v12/pkg/settings/exe"
  12. "github.com/Jguer/yay/v12/pkg/settings/parser"
  13. "github.com/Jguer/yay/v12/pkg/vcs"
  14. )
  15. func installPkgArchive(ctx context.Context,
  16. cmdBuilder exe.ICmdBuilder,
  17. mode parser.TargetMode,
  18. vcsStore vcs.Store,
  19. cmdArgs *parser.Arguments,
  20. pkgArchives []string,
  21. noConfirm bool,
  22. ) error {
  23. if len(pkgArchives) == 0 {
  24. return nil
  25. }
  26. arguments := cmdArgs.Copy()
  27. arguments.ClearTargets()
  28. arguments.Op = "U"
  29. arguments.DelArg("confirm")
  30. arguments.DelArg("noconfirm")
  31. arguments.DelArg("c", "clean")
  32. arguments.DelArg("i", "install")
  33. arguments.DelArg("q", "quiet")
  34. arguments.DelArg("y", "refresh")
  35. arguments.DelArg("u", "sysupgrade")
  36. arguments.DelArg("w", "downloadonly")
  37. arguments.DelArg("asdeps", "asdep")
  38. arguments.DelArg("asexplicit", "asexp")
  39. arguments.AddTarget(pkgArchives...)
  40. if errShow := cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
  41. arguments, mode, noConfirm)); errShow != nil {
  42. return errShow
  43. }
  44. if errStore := vcsStore.Save(); errStore != nil {
  45. fmt.Fprintln(os.Stderr, errStore)
  46. }
  47. return nil
  48. }
  49. func setInstallReason(ctx context.Context,
  50. cmdBuilder exe.ICmdBuilder, mode parser.TargetMode,
  51. cmdArgs *parser.Arguments, deps, exps []string,
  52. ) error {
  53. if len(deps)+len(exps) == 0 {
  54. return nil
  55. }
  56. if errDeps := asdeps(ctx, cmdBuilder, mode, cmdArgs, deps); errDeps != nil {
  57. return errDeps
  58. }
  59. return asexp(ctx, cmdBuilder, mode, cmdArgs, exps)
  60. }
  61. func setPkgReason(ctx context.Context,
  62. cmdBuilder exe.ICmdBuilder,
  63. mode parser.TargetMode,
  64. cmdArgs *parser.Arguments, pkgs []string, exp bool,
  65. ) error {
  66. if len(pkgs) == 0 {
  67. return nil
  68. }
  69. cmdArgs = cmdArgs.CopyGlobal()
  70. if exp {
  71. if err := cmdArgs.AddArg("q", "D", "asexplicit"); err != nil {
  72. return err
  73. }
  74. } else {
  75. if err := cmdArgs.AddArg("q", "D", "asdeps"); err != nil {
  76. return err
  77. }
  78. }
  79. for _, compositePkgName := range pkgs {
  80. pkgSplit := strings.Split(compositePkgName, "/")
  81. pkgName := pkgSplit[0]
  82. if len(pkgSplit) > 1 {
  83. pkgName = pkgSplit[1]
  84. }
  85. cmdArgs.AddTarget(pkgName)
  86. }
  87. if err := cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
  88. cmdArgs, mode, settings.NoConfirm)); err != nil {
  89. return &SetPkgReasonError{exp: exp}
  90. }
  91. return nil
  92. }
  93. func asdeps(ctx context.Context,
  94. cmdBuilder exe.ICmdBuilder,
  95. mode parser.TargetMode, cmdArgs *parser.Arguments, pkgs []string,
  96. ) error {
  97. return setPkgReason(ctx, cmdBuilder, mode, cmdArgs, pkgs, false)
  98. }
  99. func asexp(ctx context.Context,
  100. cmdBuilder exe.ICmdBuilder,
  101. mode parser.TargetMode, cmdArgs *parser.Arguments, pkgs []string,
  102. ) error {
  103. return setPkgReason(ctx, cmdBuilder, mode, cmdArgs, pkgs, true)
  104. }
  105. func parsePackageList(ctx context.Context, cmdBuilder exe.ICmdBuilder,
  106. dir string,
  107. ) (pkgdests map[string]string, pkgVersion string, err error) {
  108. stdout, stderr, err := cmdBuilder.Capture(
  109. cmdBuilder.BuildMakepkgCmd(ctx, dir, "--packagelist"))
  110. if err != nil {
  111. return nil, "", fmt.Errorf("%s %w", stderr, err)
  112. }
  113. lines := strings.Split(stdout, "\n")
  114. pkgdests = make(map[string]string)
  115. for _, line := range lines {
  116. if line == "" {
  117. continue
  118. }
  119. fileName := filepath.Base(line)
  120. split := strings.Split(fileName, "-")
  121. if len(split) < 4 {
  122. return nil, "", errors.New(gotext.Get("cannot find package name: %v", split))
  123. }
  124. // pkgname-pkgver-pkgrel-arch.pkgext
  125. // This assumes 3 dashes after the pkgname, Will cause an error
  126. // if the PKGEXT contains a dash. Please no one do that.
  127. pkgName := strings.Join(split[:len(split)-3], "-")
  128. pkgVersion = strings.Join(split[len(split)-3:len(split)-1], "-")
  129. pkgdests[pkgName] = line
  130. }
  131. if len(pkgdests) == 0 {
  132. return nil, "", &NoPkgDestsFoundError{dir}
  133. }
  134. return pkgdests, pkgVersion, nil
  135. }