yay/pkg/menus/clean_menu.go

118 lines
2.9 KiB
Go
Raw Normal View History

// Clean Build Menu functions
2021-10-11 20:22:03 +00:00
package menus
import (
"fmt"
"os"
"path/filepath"
"github.com/leonelquinteros/gotext"
"github.com/Jguer/yay/v11/pkg/dep"
"github.com/Jguer/yay/v11/pkg/intrange"
"github.com/Jguer/yay/v11/pkg/settings"
"github.com/Jguer/yay/v11/pkg/stringset"
"github.com/Jguer/yay/v11/pkg/text"
)
2021-10-11 20:22:03 +00:00
func cleanNumberMenu(buildDir string, bases []dep.Base,
installed stringset.StringSet, answerClean string, noConfirm bool) ([]dep.Base, error) {
toClean := make([]dep.Base, 0)
text.Infoln(gotext.Get("Packages to cleanBuild?"))
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"))))
2021-10-11 20:22:03 +00:00
cleanInput, err := text.GetInput(answerClean, noConfirm)
if err != nil {
return nil, err
}
cInclude, cExclude, cOtherInclude, cOtherExclude := intrange.ParseNumberMenu(cleanInput)
cIsInclude := len(cExclude) == 0 && len(cOtherExclude) == 0
if cOtherInclude.Get("abort") || cOtherInclude.Get("ab") {
return nil, settings.ErrUserAbort{}
}
if !cOtherInclude.Get("n") && !cOtherInclude.Get("none") {
for i, base := range bases {
pkg := base.Pkgbase()
anyInstalled := base.AnyIsInSet(installed)
2021-10-11 20:22:03 +00:00
dir := filepath.Join(buildDir, pkg)
if _, err := os.Stat(dir); os.IsNotExist(err) {
continue
}
if !cIsInclude && cExclude.Get(len(bases)-i) {
continue
}
if anyInstalled && (cOtherInclude.Get("i") || cOtherInclude.Get("installed")) {
toClean = append(toClean, base)
continue
}
if !anyInstalled && (cOtherInclude.Get("no") || cOtherInclude.Get("notinstalled")) {
toClean = append(toClean, base)
continue
}
if cOtherInclude.Get("a") || cOtherInclude.Get("all") {
toClean = append(toClean, base)
continue
}
if cIsInclude && (cInclude.Get(len(bases)-i) || cOtherInclude.Get(pkg)) {
toClean = append(toClean, base)
continue
}
if !cIsInclude && (!cExclude.Get(len(bases)-i) && !cOtherExclude.Get(pkg)) {
toClean = append(toClean, base)
continue
}
}
}
return toClean, nil
}
2021-10-11 20:22:03 +00:00
func anyExistInCache(buildDir string, bases []dep.Base) bool {
for _, base := range bases {
pkg := base.Pkgbase()
2021-10-11 20:22:03 +00:00
dir := filepath.Join(buildDir, pkg)
if _, err := os.Stat(dir); !os.IsNotExist(err) {
return true
}
}
return false
}
2021-10-11 20:22:03 +00:00
func Clean(cleanMenuOption bool, buildDir string, aurBases []dep.Base,
installed stringset.StringSet, noConfirm bool, answerClean string) error {
if !(cleanMenuOption && anyExistInCache(buildDir, aurBases)) {
return nil
}
2021-10-11 20:22:03 +00:00
pkgbuildNumberMenu(buildDir, aurBases, installed)
2021-10-11 20:22:03 +00:00
toClean, errClean := cleanNumberMenu(buildDir, aurBases, installed, answerClean, noConfirm)
if errClean != nil {
return errClean
}
for i, base := range toClean {
2021-10-11 20:22:03 +00:00
dir := filepath.Join(buildDir, base.Pkgbase())
text.OperationInfoln(gotext.Get("Deleting (%d/%d): %s", i+1, len(toClean), text.Cyan(dir)))
if err := os.RemoveAll(dir); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}
return nil
}