install.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package main
  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 setPkgReason(ctx context.Context,
  16. cmdBuilder exe.ICmdBuilder,
  17. mode parser.TargetMode,
  18. cmdArgs *parser.Arguments, pkgs []string, exp bool,
  19. ) error {
  20. if len(pkgs) == 0 {
  21. return nil
  22. }
  23. cmdArgs = cmdArgs.CopyGlobal()
  24. if exp {
  25. if err := cmdArgs.AddArg("q", "D", "asexplicit"); err != nil {
  26. return err
  27. }
  28. } else {
  29. if err := cmdArgs.AddArg("q", "D", "asdeps"); err != nil {
  30. return err
  31. }
  32. }
  33. for _, compositePkgName := range pkgs {
  34. pkgSplit := strings.Split(compositePkgName, "/")
  35. pkgName := pkgSplit[0]
  36. if len(pkgSplit) > 1 {
  37. pkgName = pkgSplit[1]
  38. }
  39. cmdArgs.AddTarget(pkgName)
  40. }
  41. if err := cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
  42. cmdArgs, mode, settings.NoConfirm)); err != nil {
  43. return &SetPkgReasonError{exp: exp}
  44. }
  45. return nil
  46. }
  47. func asdeps(ctx context.Context,
  48. cmdBuilder exe.ICmdBuilder,
  49. mode parser.TargetMode, cmdArgs *parser.Arguments, pkgs []string,
  50. ) error {
  51. return setPkgReason(ctx, cmdBuilder, mode, cmdArgs, pkgs, false)
  52. }
  53. func asexp(ctx context.Context,
  54. cmdBuilder exe.ICmdBuilder,
  55. mode parser.TargetMode, cmdArgs *parser.Arguments, pkgs []string,
  56. ) error {
  57. return setPkgReason(ctx, cmdBuilder, mode, cmdArgs, pkgs, true)
  58. }
  59. func removeMake(ctx context.Context, config *settings.Configuration,
  60. cmdBuilder exe.ICmdBuilder, makeDeps []string, cmdArgs *parser.Arguments,
  61. ) error {
  62. removeArguments := cmdArgs.CopyGlobal()
  63. err := removeArguments.AddArg("R", "s", "u")
  64. if err != nil {
  65. return err
  66. }
  67. for _, pkg := range makeDeps {
  68. removeArguments.AddTarget(pkg)
  69. }
  70. oldValue := settings.NoConfirm
  71. settings.NoConfirm = true
  72. err = cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
  73. removeArguments, config.Mode, settings.NoConfirm))
  74. settings.NoConfirm = oldValue
  75. return err
  76. }
  77. func earlyRefresh(ctx context.Context, cfg *settings.Configuration, cmdBuilder exe.ICmdBuilder, cmdArgs *parser.Arguments) error {
  78. arguments := cmdArgs.Copy()
  79. if cfg.CombinedUpgrade {
  80. arguments.DelArg("u", "sysupgrade")
  81. }
  82. arguments.DelArg("s", "search")
  83. arguments.DelArg("i", "info")
  84. arguments.DelArg("l", "list")
  85. arguments.ClearTargets()
  86. return cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
  87. arguments, cfg.Mode, settings.NoConfirm))
  88. }
  89. func parsePackageList(ctx context.Context, cmdBuilder exe.ICmdBuilder,
  90. dir string,
  91. ) (pkgdests map[string]string, pkgVersion string, err error) {
  92. stdout, stderr, err := cmdBuilder.Capture(
  93. cmdBuilder.BuildMakepkgCmd(ctx, dir, "--packagelist"))
  94. if err != nil {
  95. return nil, "", fmt.Errorf("%s %w", stderr, err)
  96. }
  97. lines := strings.Split(stdout, "\n")
  98. pkgdests = make(map[string]string)
  99. for _, line := range lines {
  100. if line == "" {
  101. continue
  102. }
  103. fileName := filepath.Base(line)
  104. split := strings.Split(fileName, "-")
  105. if len(split) < 4 {
  106. return nil, "", errors.New(gotext.Get("cannot find package name: %v", split))
  107. }
  108. // pkgname-pkgver-pkgrel-arch.pkgext
  109. // This assumes 3 dashes after the pkgname, Will cause an error
  110. // if the PKGEXT contains a dash. Please no one do that.
  111. pkgName := strings.Join(split[:len(split)-3], "-")
  112. pkgVersion = strings.Join(split[len(split)-3:len(split)-1], "-")
  113. pkgdests[pkgName] = line
  114. }
  115. if len(pkgdests) == 0 {
  116. return nil, "", &NoPkgDestsFoundError{dir}
  117. }
  118. return pkgdests, pkgVersion, nil
  119. }
  120. func gitMerge(ctx context.Context, cmdBuilder exe.ICmdBuilder, dir string) error {
  121. _, stderr, err := cmdBuilder.Capture(
  122. cmdBuilder.BuildGitCmd(ctx,
  123. dir, "reset", "--hard", "HEAD"))
  124. if err != nil {
  125. return errors.New(gotext.Get("error resetting %s: %s", dir, stderr))
  126. }
  127. _, stderr, err = cmdBuilder.Capture(
  128. cmdBuilder.BuildGitCmd(ctx,
  129. dir, "merge", "--no-edit", "--ff"))
  130. if err != nil {
  131. return errors.New(gotext.Get("error merging %s: %s", dir, stderr))
  132. }
  133. return nil
  134. }
  135. func mergePkgbuilds(ctx context.Context, cmdBuilder exe.ICmdBuilder, pkgbuildDirs map[string]string) error {
  136. for _, dir := range pkgbuildDirs {
  137. err := gitMerge(ctx, cmdBuilder, dir)
  138. if err != nil {
  139. return err
  140. }
  141. }
  142. return nil
  143. }
  144. func installPkgArchive(ctx context.Context,
  145. cmdBuilder exe.ICmdBuilder,
  146. mode parser.TargetMode,
  147. vcsStore vcs.Store,
  148. cmdArgs *parser.Arguments,
  149. pkgArchives []string,
  150. noConfirm bool,
  151. ) error {
  152. if len(pkgArchives) == 0 {
  153. return nil
  154. }
  155. arguments := cmdArgs.Copy()
  156. arguments.ClearTargets()
  157. arguments.Op = "U"
  158. arguments.DelArg("confirm")
  159. arguments.DelArg("noconfirm")
  160. arguments.DelArg("c", "clean")
  161. arguments.DelArg("i", "install")
  162. arguments.DelArg("q", "quiet")
  163. arguments.DelArg("y", "refresh")
  164. arguments.DelArg("u", "sysupgrade")
  165. arguments.DelArg("w", "downloadonly")
  166. arguments.DelArg("asdeps", "asdep")
  167. arguments.DelArg("asexplicit", "asexp")
  168. arguments.AddTarget(pkgArchives...)
  169. if errShow := cmdBuilder.Show(cmdBuilder.BuildPacmanCmd(ctx,
  170. arguments, mode, noConfirm)); errShow != nil {
  171. return errShow
  172. }
  173. if errStore := vcsStore.Save(); errStore != nil {
  174. fmt.Fprintln(os.Stderr, errStore)
  175. }
  176. return nil
  177. }
  178. func setInstallReason(ctx context.Context,
  179. cmdBuilder exe.ICmdBuilder, mode parser.TargetMode,
  180. cmdArgs *parser.Arguments, deps, exps []string,
  181. ) error {
  182. if len(deps)+len(exps) == 0 {
  183. return nil
  184. }
  185. if errDeps := asdeps(ctx, cmdBuilder, mode, cmdArgs, deps); errDeps != nil {
  186. return errDeps
  187. }
  188. return asexp(ctx, cmdBuilder, mode, cmdArgs, exps)
  189. }