clean_menu.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 len(pkgbuildDirsByBase) == 0 {
  23. return nil // no work to do
  24. }
  25. if !anyExistInCache(pkgbuildDirsByBase) {
  26. return nil
  27. }
  28. skipFunc := func(pkg string) bool {
  29. dir := pkgbuildDirsByBase[pkg]
  30. if _, err := os.Stat(dir); os.IsNotExist(err) {
  31. return true
  32. }
  33. return false
  34. }
  35. bases := make([]string, 0, len(pkgbuildDirsByBase))
  36. for pkg := range pkgbuildDirsByBase {
  37. bases = append(bases, pkg)
  38. }
  39. // TOFIX: empty installed slice means installed filter is disabled
  40. toClean, errClean := selectionMenu(w, pkgbuildDirsByBase, bases, mapset.NewSet[string](),
  41. gotext.Get("Packages to cleanBuild?"),
  42. settings.NoConfirm, config.AnswerClean, skipFunc)
  43. if errClean != nil {
  44. return errClean
  45. }
  46. for i, base := range toClean {
  47. dir := pkgbuildDirsByBase[base]
  48. text.OperationInfoln(gotext.Get("Deleting (%d/%d): %s", i+1, len(toClean), text.Cyan(dir)))
  49. if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(ctx, dir, "reset", "--hard")); err != nil {
  50. text.Warnln(gotext.Get("Unable to clean:"), dir)
  51. return err
  52. }
  53. if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(ctx, dir, "clean", "-fdx")); err != nil {
  54. text.Warnln(gotext.Get("Unable to clean:"), dir)
  55. return err
  56. }
  57. }
  58. return nil
  59. }
  60. func Clean(w io.Writer, cleanMenuOption bool, pkgbuildDirs map[string]string,
  61. installed mapset.Set[string], noConfirm bool, answerClean string,
  62. ) error {
  63. if !(cleanMenuOption && anyExistInCache(pkgbuildDirs)) {
  64. return nil
  65. }
  66. skipFunc := func(pkg string) bool {
  67. dir := pkgbuildDirs[pkg]
  68. if _, err := os.Stat(dir); os.IsNotExist(err) {
  69. return true
  70. }
  71. return false
  72. }
  73. bases := make([]string, 0, len(pkgbuildDirs))
  74. for pkg := range pkgbuildDirs {
  75. bases = append(bases, pkg)
  76. }
  77. toClean, errClean := selectionMenu(w, pkgbuildDirs, bases, installed, gotext.Get("Packages to cleanBuild?"),
  78. noConfirm, answerClean, skipFunc)
  79. if errClean != nil {
  80. return errClean
  81. }
  82. for i, base := range toClean {
  83. dir := pkgbuildDirs[base]
  84. text.OperationInfoln(gotext.Get("Deleting (%d/%d): %s", i+1, len(toClean), text.Cyan(dir)))
  85. if err := os.RemoveAll(dir); err != nil {
  86. fmt.Fprintln(os.Stderr, err)
  87. }
  88. }
  89. return nil
  90. }