download.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "github.com/leonelquinteros/gotext"
  8. "github.com/Jguer/yay/v10/pkg/db"
  9. "github.com/Jguer/yay/v10/pkg/download"
  10. "github.com/Jguer/yay/v10/pkg/settings"
  11. "github.com/Jguer/yay/v10/pkg/settings/exe"
  12. "github.com/Jguer/yay/v10/pkg/text"
  13. )
  14. const gitDiffRefName = "AUR_SEEN"
  15. // Update the YAY_DIFF_REVIEW ref to HEAD. We use this ref to determine which diff were
  16. // reviewed by the user
  17. func gitUpdateSeenRef(path, name string) error {
  18. _, stderr, err := config.Runtime.CmdRunner.Capture(
  19. config.Runtime.CmdBuilder.BuildGitCmd(
  20. filepath.Join(path, name), "update-ref", gitDiffRefName, "HEAD"), 0)
  21. if err != nil {
  22. return fmt.Errorf("%s %s", stderr, err)
  23. }
  24. return nil
  25. }
  26. // Return wether or not we have reviewed a diff yet. It checks for the existence of
  27. // YAY_DIFF_REVIEW in the git ref-list
  28. func gitHasLastSeenRef(path, name string) bool {
  29. _, _, err := config.Runtime.CmdRunner.Capture(
  30. config.Runtime.CmdBuilder.BuildGitCmd(
  31. filepath.Join(path, name), "rev-parse", "--quiet", "--verify", gitDiffRefName), 0)
  32. return err == nil
  33. }
  34. // Returns the last reviewed hash. If YAY_DIFF_REVIEW exists it will return this hash.
  35. // If it does not it will return empty tree as no diff have been reviewed yet.
  36. func getLastSeenHash(path, name string) (string, error) {
  37. if gitHasLastSeenRef(path, name) {
  38. stdout, stderr, err := config.Runtime.CmdRunner.Capture(
  39. config.Runtime.CmdBuilder.BuildGitCmd(
  40. filepath.Join(path, name), "rev-parse", gitDiffRefName), 0)
  41. if err != nil {
  42. return "", fmt.Errorf("%s %s", stderr, err)
  43. }
  44. lines := strings.Split(stdout, "\n")
  45. return lines[0], nil
  46. }
  47. return gitEmptyTree, nil
  48. }
  49. // Check whether or not a diff exists between the last reviewed diff and
  50. // HEAD@{upstream}
  51. func gitHasDiff(path, name string) (bool, error) {
  52. if gitHasLastSeenRef(path, name) {
  53. stdout, stderr, err := config.Runtime.CmdRunner.Capture(
  54. config.Runtime.CmdBuilder.BuildGitCmd(filepath.Join(path, name), "rev-parse", gitDiffRefName, "HEAD@{upstream}"), 0)
  55. if err != nil {
  56. return false, fmt.Errorf("%s%s", stderr, err)
  57. }
  58. lines := strings.Split(stdout, "\n")
  59. lastseen := lines[0]
  60. upstream := lines[1]
  61. return lastseen != upstream, nil
  62. }
  63. // If YAY_DIFF_REVIEW does not exists, we have never reviewed a diff for this package
  64. // and should display it.
  65. return true, nil
  66. }
  67. func gitDownload(url, path, name string) (bool, error) {
  68. _, err := os.Stat(filepath.Join(path, name, ".git"))
  69. if os.IsNotExist(err) {
  70. cmd := config.Runtime.CmdBuilder.BuildGitCmd(path, "clone", "--no-progress", url, name)
  71. _, stderr, errCapture := config.Runtime.CmdRunner.Capture(cmd, 0)
  72. if errCapture != nil {
  73. return false, fmt.Errorf(gotext.Get("error cloning %s: %s", name, stderr))
  74. }
  75. return true, nil
  76. } else if err != nil {
  77. return false, fmt.Errorf(gotext.Get("error reading %s", filepath.Join(path, name, ".git")))
  78. }
  79. cmd := config.Runtime.CmdBuilder.BuildGitCmd(filepath.Join(path, name), "fetch")
  80. _, stderr, err := config.Runtime.CmdRunner.Capture(cmd, 0)
  81. if err != nil {
  82. return false, fmt.Errorf(gotext.Get("error fetching %s: %s", name, stderr))
  83. }
  84. return false, nil
  85. }
  86. func gitMerge(path, name string) error {
  87. _, stderr, err := config.Runtime.CmdRunner.Capture(
  88. config.Runtime.CmdBuilder.BuildGitCmd(
  89. filepath.Join(path, name), "reset", "--hard", "HEAD"), 0)
  90. if err != nil {
  91. return fmt.Errorf(gotext.Get("error resetting %s: %s", name, stderr))
  92. }
  93. _, stderr, err = config.Runtime.CmdRunner.Capture(
  94. config.Runtime.CmdBuilder.BuildGitCmd(
  95. filepath.Join(path, name), "merge", "--no-edit", "--ff"), 0)
  96. if err != nil {
  97. return fmt.Errorf(gotext.Get("error merging %s: %s", name, stderr))
  98. }
  99. return nil
  100. }
  101. func getPkgbuilds(dbExecutor db.Executor,
  102. cmdRunner exe.Runner,
  103. cmdBuilder exe.GitCmdBuilder, targets []string,
  104. mode settings.TargetMode,
  105. aurURL string,
  106. force bool) error {
  107. wd, err := os.Getwd()
  108. if err != nil {
  109. return err
  110. }
  111. cloned, errD := download.PKGBUILDRepos(dbExecutor, cmdRunner, cmdBuilder, targets, mode, aurURL, wd, force)
  112. if errD != nil {
  113. text.Errorln(errD)
  114. }
  115. if len(targets) != len(cloned) {
  116. missing := []string{}
  117. for _, target := range targets {
  118. if _, ok := cloned[target]; !ok {
  119. missing = append(missing, target)
  120. }
  121. }
  122. text.Warnln(gotext.Get("Unable to find the following packages:"), strings.Join(missing, ", "))
  123. err = fmt.Errorf("")
  124. }
  125. return err
  126. }