clean_menu.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Clean Build Menu functions
  2. package main
  3. import (
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "github.com/leonelquinteros/gotext"
  8. "github.com/Jguer/yay/v11/pkg/dep"
  9. "github.com/Jguer/yay/v11/pkg/intrange"
  10. "github.com/Jguer/yay/v11/pkg/settings"
  11. "github.com/Jguer/yay/v11/pkg/stringset"
  12. "github.com/Jguer/yay/v11/pkg/text"
  13. )
  14. func cleanNumberMenu(bases []dep.Base, installed stringset.StringSet, hasClean bool) ([]dep.Base, error) {
  15. toClean := make([]dep.Base, 0)
  16. if !hasClean {
  17. return toClean, nil
  18. }
  19. text.Infoln(gotext.Get("Packages to cleanBuild?"))
  20. text.Infoln(gotext.Get("%s [A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)", text.Cyan(gotext.Get("[N]one"))))
  21. cleanInput, err := getInput(config.AnswerClean)
  22. if err != nil {
  23. return nil, err
  24. }
  25. cInclude, cExclude, cOtherInclude, cOtherExclude := intrange.ParseNumberMenu(cleanInput)
  26. cIsInclude := len(cExclude) == 0 && len(cOtherExclude) == 0
  27. if cOtherInclude.Get("abort") || cOtherInclude.Get("ab") {
  28. return nil, settings.ErrUserAbort{}
  29. }
  30. if !cOtherInclude.Get("n") && !cOtherInclude.Get("none") {
  31. for i, base := range bases {
  32. pkg := base.Pkgbase()
  33. anyInstalled := false
  34. for _, b := range base {
  35. anyInstalled = anyInstalled || installed.Get(b.Name)
  36. }
  37. dir := filepath.Join(config.BuildDir, pkg)
  38. if _, err := os.Stat(dir); os.IsNotExist(err) {
  39. continue
  40. }
  41. if !cIsInclude && cExclude.Get(len(bases)-i) {
  42. continue
  43. }
  44. if anyInstalled && (cOtherInclude.Get("i") || cOtherInclude.Get("installed")) {
  45. toClean = append(toClean, base)
  46. continue
  47. }
  48. if !anyInstalled && (cOtherInclude.Get("no") || cOtherInclude.Get("notinstalled")) {
  49. toClean = append(toClean, base)
  50. continue
  51. }
  52. if cOtherInclude.Get("a") || cOtherInclude.Get("all") {
  53. toClean = append(toClean, base)
  54. continue
  55. }
  56. if cIsInclude && (cInclude.Get(len(bases)-i) || cOtherInclude.Get(pkg)) {
  57. toClean = append(toClean, base)
  58. continue
  59. }
  60. if !cIsInclude && (!cExclude.Get(len(bases)-i) && !cOtherExclude.Get(pkg)) {
  61. toClean = append(toClean, base)
  62. continue
  63. }
  64. }
  65. }
  66. return toClean, nil
  67. }
  68. func anyExistInCache(bases []dep.Base) bool {
  69. for _, base := range bases {
  70. pkg := base.Pkgbase()
  71. dir := filepath.Join(config.BuildDir, pkg)
  72. if _, err := os.Stat(dir); !os.IsNotExist(err) {
  73. return true
  74. }
  75. }
  76. return false
  77. }
  78. func cleanMenu(cleanMenuOption bool, aurBases []dep.Base, installed stringset.StringSet) error {
  79. if !(cleanMenuOption && anyExistInCache(aurBases)) {
  80. return nil
  81. }
  82. askClean := pkgbuildNumberMenu(aurBases, installed)
  83. toClean, errClean := cleanNumberMenu(aurBases, installed, askClean)
  84. if errClean != nil {
  85. return errClean
  86. }
  87. for i, base := range toClean {
  88. dir := filepath.Join(config.BuildDir, base.Pkgbase())
  89. text.OperationInfoln(gotext.Get("Deleting (%d/%d): %s", i+1, len(toClean), text.Cyan(dir)))
  90. if err := os.RemoveAll(dir); err != nil {
  91. fmt.Fprintln(os.Stderr, err)
  92. }
  93. }
  94. return nil
  95. }