clean_menu.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Clean Build Menu functions
  2. package menus
  3. import (
  4. "context"
  5. "fmt"
  6. "io"
  7. "os"
  8. mapset "github.com/deckarep/golang-set/v2"
  9. "github.com/leonelquinteros/gotext"
  10. "github.com/Jguer/yay/v11/pkg/settings"
  11. "github.com/Jguer/yay/v11/pkg/text"
  12. )
  13. func anyExistInCache(pkgbuildDirs map[string]string) bool {
  14. for _, dir := range pkgbuildDirs {
  15. if _, err := os.Stat(dir); !os.IsNotExist(err) {
  16. return true
  17. }
  18. }
  19. return false
  20. }
  21. func CleanFn(ctx context.Context, config *settings.Configuration, w io.Writer, pkgbuildDirsByBase map[string]string) error {
  22. if !anyExistInCache(pkgbuildDirsByBase) {
  23. return nil
  24. }
  25. skipFunc := func(pkg string) bool {
  26. dir := pkgbuildDirsByBase[pkg]
  27. if _, err := os.Stat(dir); os.IsNotExist(err) {
  28. return true
  29. }
  30. return false
  31. }
  32. bases := make([]string, 0, len(pkgbuildDirsByBase))
  33. for pkg := range pkgbuildDirsByBase {
  34. bases = append(bases, pkg)
  35. }
  36. // TOFIX: empty installed slice means installed filter is disabled
  37. toClean, errClean := selectionMenu(w, pkgbuildDirsByBase, bases, mapset.NewSet[string](),
  38. gotext.Get("Packages to cleanBuild?"),
  39. settings.NoConfirm, config.AnswerClean, skipFunc)
  40. if errClean != nil {
  41. return errClean
  42. }
  43. for i, base := range toClean {
  44. dir := pkgbuildDirsByBase[base]
  45. text.OperationInfoln(gotext.Get("Deleting (%d/%d): %s", i+1, len(toClean), text.Cyan(dir)))
  46. if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(ctx, dir, "reset", "--hard")); err != nil {
  47. text.Warnln(gotext.Get("Unable to clean:"), dir)
  48. return err
  49. }
  50. if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(ctx, dir, "clean", "-fdx")); err != nil {
  51. text.Warnln(gotext.Get("Unable to clean:"), dir)
  52. return err
  53. }
  54. }
  55. return nil
  56. }
  57. func Clean(w io.Writer, cleanMenuOption bool, pkgbuildDirs map[string]string,
  58. installed mapset.Set[string], noConfirm bool, answerClean string,
  59. ) error {
  60. if !(cleanMenuOption && anyExistInCache(pkgbuildDirs)) {
  61. return nil
  62. }
  63. skipFunc := func(pkg string) bool {
  64. dir := pkgbuildDirs[pkg]
  65. if _, err := os.Stat(dir); os.IsNotExist(err) {
  66. return true
  67. }
  68. return false
  69. }
  70. bases := make([]string, 0, len(pkgbuildDirs))
  71. for pkg := range pkgbuildDirs {
  72. bases = append(bases, pkg)
  73. }
  74. toClean, errClean := selectionMenu(w, pkgbuildDirs, bases, installed, gotext.Get("Packages to cleanBuild?"),
  75. noConfirm, answerClean, skipFunc)
  76. if errClean != nil {
  77. return errClean
  78. }
  79. for i, base := range toClean {
  80. dir := pkgbuildDirs[base]
  81. text.OperationInfoln(gotext.Get("Deleting (%d/%d): %s", i+1, len(toClean), text.Cyan(dir)))
  82. if err := os.RemoveAll(dir); err != nil {
  83. fmt.Fprintln(os.Stderr, err)
  84. }
  85. }
  86. return nil
  87. }