diff --git a/config.go b/config.go index 90d1ab6..9bf6409 100644 --- a/config.go +++ b/config.go @@ -1,14 +1,7 @@ package main import ( - "bufio" - "fmt" - "os" - - "github.com/leonelquinteros/gotext" - "github.com/Jguer/yay/v11/pkg/settings" - "github.com/Jguer/yay/v11/pkg/text" ) // Verbosity settings for search. @@ -24,25 +17,3 @@ var localePath = "/usr/share/locale" // YayConf holds the current config values for yay. var config *settings.Configuration - -func getInput(defaultValue string) (string, error) { - text.Info() - - if defaultValue != "" || settings.NoConfirm { - fmt.Println(defaultValue) - return defaultValue, nil - } - - reader := bufio.NewReader(os.Stdin) - - buf, overflow, err := reader.ReadLine() - if err != nil { - return "", err - } - - if overflow { - return "", fmt.Errorf(gotext.Get("input too long")) - } - - return string(buf), nil -} diff --git a/install.go b/install.go index c0b9de1..ea59fc3 100644 --- a/install.go +++ b/install.go @@ -18,6 +18,7 @@ import ( "github.com/Jguer/yay/v11/pkg/db" "github.com/Jguer/yay/v11/pkg/dep" "github.com/Jguer/yay/v11/pkg/download" + "github.com/Jguer/yay/v11/pkg/menus" "github.com/Jguer/yay/v11/pkg/pgp" "github.com/Jguer/yay/v11/pkg/query" "github.com/Jguer/yay/v11/pkg/settings" @@ -26,8 +27,6 @@ import ( "github.com/Jguer/yay/v11/pkg/text" ) -const gitEmptyTree = "4b825dc642cb6eb9a060e54bf8d69288fbee4904" - func asdeps(ctx context.Context, cmdArgs *parser.Arguments, pkgs []string) (err error) { if len(pkgs) == 0 { return nil @@ -219,7 +218,9 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu } } - if errCleanMenu := cleanMenu(config.CleanMenu, do.Aur, remoteNamesCache); errCleanMenu != nil { + if errCleanMenu := menus.Clean(config.CleanMenu, + config.BuildDir, do.Aur, + remoteNamesCache, settings.NoConfirm, config.AnswerClean); errCleanMenu != nil { if errors.As(errCleanMenu, &settings.ErrUserAbort{}) { return errCleanMenu } @@ -248,7 +249,9 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu return errA } - if errDiffMenu := diffMenu(ctx, config.DiffMenu, do.Aur, remoteNamesCache, cloned); errDiffMenu != nil { + if errDiffMenu := menus.Diff(ctx, config.Runtime.CmdBuilder, config.BuildDir, + config.DiffMenu, do.Aur, remoteNamesCache, + cloned, settings.NoConfirm, config.AnswerDiff); errDiffMenu != nil { if errors.As(errDiffMenu, &settings.ErrUserAbort{}) { return errDiffMenu } @@ -265,7 +268,9 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu return err } - if errEditMenu := editMenu(config.EditMenu, do.Aur, remoteNamesCache, srcinfos); errEditMenu != nil { + if errEditMenu := menus.Edit(config.EditMenu, config.BuildDir, do.Aur, + config.Editor, config.EditorFlags, remoteNamesCache, srcinfos, + settings.NoConfirm, config.AnswerEdit); errEditMenu != nil { if errors.As(errEditMenu, &settings.ErrUserAbort{}) { return errEditMenu } @@ -502,30 +507,6 @@ func parsePackageList(ctx context.Context, dir string) (pkgdests map[string]stri return pkgdests, pkgVersion, nil } -func pkgbuildNumberMenu(bases []dep.Base, installed stringset.StringSet) { - toPrint := "" - - for n, base := range bases { - pkg := base.Pkgbase() - dir := filepath.Join(config.BuildDir, pkg) - - toPrint += fmt.Sprintf(text.Magenta("%3d")+" %-40s", len(bases)-n, - text.Bold(base.String())) - - if base.AnyIsInSet(installed) { - toPrint += text.Bold(text.Green(gotext.Get(" (Installed)"))) - } - - if _, err := os.Stat(dir); !os.IsNotExist(err) { - toPrint += text.Bold(text.Green(gotext.Get(" (Build Files Exist)"))) - } - - toPrint += "\n" - } - - fmt.Print(toPrint) -} - func parseSrcinfoFiles(bases []dep.Base, errIsFatal bool) (map[string]*gosrc.Srcinfo, error) { srcinfos := make(map[string]*gosrc.Srcinfo) diff --git a/clean_menu.go b/pkg/menus/clean_menu.go similarity index 74% rename from clean_menu.go rename to pkg/menus/clean_menu.go index e027313..aedf3fa 100644 --- a/clean_menu.go +++ b/pkg/menus/clean_menu.go @@ -1,5 +1,5 @@ // Clean Build Menu functions -package main +package menus import ( "fmt" @@ -15,13 +15,14 @@ import ( "github.com/Jguer/yay/v11/pkg/text" ) -func cleanNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) { +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")))) - cleanInput, err := getInput(config.AnswerClean) + cleanInput, err := text.GetInput(answerClean, noConfirm) if err != nil { return nil, err } @@ -38,7 +39,7 @@ func cleanNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Bas pkg := base.Pkgbase() anyInstalled := base.AnyIsInSet(installed) - dir := filepath.Join(config.BuildDir, pkg) + dir := filepath.Join(buildDir, pkg) if _, err := os.Stat(dir); os.IsNotExist(err) { continue } @@ -77,10 +78,10 @@ func cleanNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Bas return toClean, nil } -func anyExistInCache(bases []dep.Base) bool { +func anyExistInCache(buildDir string, bases []dep.Base) bool { for _, base := range bases { pkg := base.Pkgbase() - dir := filepath.Join(config.BuildDir, pkg) + dir := filepath.Join(buildDir, pkg) if _, err := os.Stat(dir); !os.IsNotExist(err) { return true @@ -90,20 +91,21 @@ func anyExistInCache(bases []dep.Base) bool { return false } -func cleanMenu(cleanMenuOption bool, aurBases []dep.Base, installed stringset.StringSet) error { - if !(cleanMenuOption && anyExistInCache(aurBases)) { +func Clean(cleanMenuOption bool, buildDir string, aurBases []dep.Base, + installed stringset.StringSet, noConfirm bool, answerClean string) error { + if !(cleanMenuOption && anyExistInCache(buildDir, aurBases)) { return nil } - pkgbuildNumberMenu(aurBases, installed) + pkgbuildNumberMenu(buildDir, aurBases, installed) - toClean, errClean := cleanNumberMenu(aurBases, installed) + toClean, errClean := cleanNumberMenu(buildDir, aurBases, installed, answerClean, noConfirm) if errClean != nil { return errClean } for i, base := range toClean { - dir := filepath.Join(config.BuildDir, base.Pkgbase()) + 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 { diff --git a/diff_menu.go b/pkg/menus/diff_menu.go similarity index 55% rename from diff_menu.go rename to pkg/menus/diff_menu.go index 4ef3317..46151e8 100644 --- a/diff_menu.go +++ b/pkg/menus/diff_menu.go @@ -1,5 +1,5 @@ // file dedicated to diff menu -package main +package menus import ( "context" @@ -12,20 +12,24 @@ import ( "github.com/Jguer/yay/v11/pkg/dep" "github.com/Jguer/yay/v11/pkg/multierror" "github.com/Jguer/yay/v11/pkg/settings" + "github.com/Jguer/yay/v11/pkg/settings/exe" "github.com/Jguer/yay/v11/pkg/stringset" "github.com/Jguer/yay/v11/pkg/text" ) -const gitDiffRefName = "AUR_SEEN" +const ( + gitEmptyTree = "4b825dc642cb6eb9a060e54bf8d69288fbee4904" + gitDiffRefName = "AUR_SEEN" +) -func showPkgbuildDiffs(ctx context.Context, bases []dep.Base, cloned map[string]bool) error { +func showPkgbuildDiffs(ctx context.Context, cmdBuilder exe.ICmdBuilder, buildDir string, bases []dep.Base, cloned map[string]bool) error { var errMulti multierror.MultiError for _, base := range bases { pkg := base.Pkgbase() - dir := filepath.Join(config.BuildDir, pkg) + dir := filepath.Join(buildDir, pkg) - start, err := getLastSeenHash(ctx, config.BuildDir, pkg) + start, err := getLastSeenHash(ctx, cmdBuilder, buildDir, pkg) if err != nil { errMulti.Add(err) @@ -35,7 +39,7 @@ func showPkgbuildDiffs(ctx context.Context, bases []dep.Base, cloned map[string] if cloned[pkg] { start = gitEmptyTree } else { - hasDiff, err := gitHasDiff(ctx, config.BuildDir, pkg) + hasDiff, err := gitHasDiff(ctx, cmdBuilder, buildDir, pkg) if err != nil { errMulti.Add(err) @@ -60,7 +64,7 @@ func showPkgbuildDiffs(ctx context.Context, bases []dep.Base, cloned map[string] args = append(args, "--color=never") } - _ = config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(ctx, dir, args...)) + _ = cmdBuilder.Show(cmdBuilder.BuildGitCmd(ctx, dir, args...)) } return errMulti.Return() @@ -68,10 +72,10 @@ func showPkgbuildDiffs(ctx context.Context, bases []dep.Base, cloned map[string] // Check whether or not a diff exists between the last reviewed diff and // HEAD@{upstream}. -func gitHasDiff(ctx context.Context, path, name string) (bool, error) { - if gitHasLastSeenRef(ctx, path, name) { - stdout, stderr, err := config.Runtime.CmdBuilder.Capture( - config.Runtime.CmdBuilder.BuildGitCmd(ctx, filepath.Join(path, name), "rev-parse", gitDiffRefName, "HEAD@{upstream}")) +func gitHasDiff(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) (bool, error) { + if gitHasLastSeenRef(ctx, cmdBuilder, path, name) { + stdout, stderr, err := cmdBuilder.Capture( + cmdBuilder.BuildGitCmd(ctx, filepath.Join(path, name), "rev-parse", gitDiffRefName, "HEAD@{upstream}")) if err != nil { return false, fmt.Errorf("%s%s", stderr, err) } @@ -89,9 +93,9 @@ func gitHasDiff(ctx context.Context, path, name string) (bool, error) { // Return wether or not we have reviewed a diff yet. It checks for the existence of // YAY_DIFF_REVIEW in the git ref-list. -func gitHasLastSeenRef(ctx context.Context, path, name string) bool { - _, _, err := config.Runtime.CmdBuilder.Capture( - config.Runtime.CmdBuilder.BuildGitCmd(ctx, +func gitHasLastSeenRef(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) bool { + _, _, err := cmdBuilder.Capture( + cmdBuilder.BuildGitCmd(ctx, filepath.Join(path, name), "rev-parse", "--quiet", "--verify", gitDiffRefName)) return err == nil @@ -99,10 +103,10 @@ func gitHasLastSeenRef(ctx context.Context, path, name string) bool { // Returns the last reviewed hash. If YAY_DIFF_REVIEW exists it will return this hash. // If it does not it will return empty tree as no diff have been reviewed yet. -func getLastSeenHash(ctx context.Context, path, name string) (string, error) { - if gitHasLastSeenRef(ctx, path, name) { - stdout, stderr, err := config.Runtime.CmdBuilder.Capture( - config.Runtime.CmdBuilder.BuildGitCmd(ctx, +func getLastSeenHash(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) (string, error) { + if gitHasLastSeenRef(ctx, cmdBuilder, path, name) { + stdout, stderr, err := cmdBuilder.Capture( + cmdBuilder.BuildGitCmd(ctx, filepath.Join(path, name), "rev-parse", gitDiffRefName)) if err != nil { return "", fmt.Errorf("%s %s", stderr, err) @@ -118,9 +122,9 @@ func getLastSeenHash(ctx context.Context, path, name string) (string, error) { // Update the YAY_DIFF_REVIEW ref to HEAD. We use this ref to determine which diff were // reviewed by the user. -func gitUpdateSeenRef(ctx context.Context, path, name string) error { - _, stderr, err := config.Runtime.CmdBuilder.Capture( - config.Runtime.CmdBuilder.BuildGitCmd(ctx, +func gitUpdateSeenRef(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) error { + _, stderr, err := cmdBuilder.Capture( + cmdBuilder.BuildGitCmd(ctx, filepath.Join(path, name), "update-ref", gitDiffRefName, "HEAD")) if err != nil { return fmt.Errorf("%s %s", stderr, err) @@ -129,17 +133,17 @@ func gitUpdateSeenRef(ctx context.Context, path, name string) error { return nil } -func diffNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) { - return editDiffNumberMenu(bases, installed, true) +func diffNumberMenu(bases []dep.Base, installed stringset.StringSet, noConfirm bool, defaultAnswer string) ([]dep.Base, error) { + return editDiffNumberMenu(bases, installed, true, noConfirm, defaultAnswer) } -func updatePkgbuildSeenRef(ctx context.Context, bases []dep.Base) error { +func updatePkgbuildSeenRef(ctx context.Context, cmdBuilder exe.ICmdBuilder, buildDir string, bases []dep.Base) error { var errMulti multierror.MultiError for _, base := range bases { pkg := base.Pkgbase() - if err := gitUpdateSeenRef(ctx, config.BuildDir, pkg); err != nil { + if err := gitUpdateSeenRef(ctx, cmdBuilder, buildDir, pkg); err != nil { errMulti.Add(err) } } @@ -147,19 +151,21 @@ func updatePkgbuildSeenRef(ctx context.Context, bases []dep.Base) error { return errMulti.Return() } -func diffMenu(ctx context.Context, diffMenuOption bool, bases []dep.Base, installed stringset.StringSet, cloned map[string]bool) error { +func Diff(ctx context.Context, cmdBuilder exe.ICmdBuilder, + buildDir string, diffMenuOption bool, bases []dep.Base, + installed stringset.StringSet, cloned map[string]bool, noConfirm bool, diffDefaultAnswer string) error { if !diffMenuOption { return nil } - pkgbuildNumberMenu(bases, installed) + pkgbuildNumberMenu(buildDir, bases, installed) - toDiff, errMenu := diffNumberMenu(bases, installed) + toDiff, errMenu := diffNumberMenu(bases, installed, noConfirm, diffDefaultAnswer) if errMenu != nil || len(toDiff) == 0 { return errMenu } - if errD := showPkgbuildDiffs(ctx, toDiff, cloned); errD != nil { + if errD := showPkgbuildDiffs(ctx, cmdBuilder, buildDir, toDiff, cloned); errD != nil { return errD } @@ -169,7 +175,7 @@ func diffMenu(ctx context.Context, diffMenuOption bool, bases []dep.Base, instal return settings.ErrUserAbort{} } - if errUpd := updatePkgbuildSeenRef(ctx, toDiff); errUpd != nil { + if errUpd := updatePkgbuildSeenRef(ctx, cmdBuilder, buildDir, toDiff); errUpd != nil { return errUpd } diff --git a/edit_menu.go b/pkg/menus/edit_menu.go similarity index 50% rename from edit_menu.go rename to pkg/menus/edit_menu.go index 25d2801..0570ed8 100644 --- a/edit_menu.go +++ b/pkg/menus/edit_menu.go @@ -1,5 +1,5 @@ // edit menu -package main +package menus import ( "errors" @@ -13,21 +13,20 @@ import ( "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" ) // Editor returns the preferred system editor. -func editor() (editor string, args []string) { +func editor(editorConfig, editorFlags string, noConfirm bool) (editor string, args []string) { switch { - case config.Editor != "": - editor, err := exec.LookPath(config.Editor) + case editorConfig != "": + editor, err := exec.LookPath(editorConfig) if err != nil { fmt.Fprintln(os.Stderr, err) } else { - return editor, strings.Fields(config.EditorFlags) + return editor, strings.Fields(editorFlags) } fallthrough @@ -61,7 +60,7 @@ func editor() (editor string, args []string) { for { text.Infoln(gotext.Get("Edit PKGBUILD with?")) - editorInput, err := getInput("") + editorInput, err := text.GetInput("", noConfirm) if err != nil { fmt.Fprintln(os.Stderr, err) continue @@ -83,84 +82,17 @@ func editor() (editor string, args []string) { } } -func editNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) { - return editDiffNumberMenu(bases, installed, false) +func editNumberMenu(bases []dep.Base, installed stringset.StringSet, noConfirm bool, defaultAnswer string) ([]dep.Base, error) { + return editDiffNumberMenu(bases, installed, false, noConfirm, defaultAnswer) } -func editDiffNumberMenu(bases []dep.Base, installed stringset.StringSet, diff bool) ([]dep.Base, error) { - var ( - toEdit = make([]dep.Base, 0) - editInput string - err error - ) - - if diff { - text.Infoln(gotext.Get("Diffs to show?")) - 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")))) - - editInput, err = getInput(config.AnswerDiff) - if err != nil { - return nil, err - } - } else { - text.Infoln(gotext.Get("PKGBUILDs to edit?")) - 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")))) - editInput, err = getInput(config.AnswerEdit) - if err != nil { - return nil, err - } - } - - eInclude, eExclude, eOtherInclude, eOtherExclude := intrange.ParseNumberMenu(editInput) - eIsInclude := len(eExclude) == 0 && len(eOtherExclude) == 0 - - if eOtherInclude.Get("abort") || eOtherInclude.Get("ab") { - return nil, &settings.ErrUserAbort{} - } - - if !eOtherInclude.Get("n") && !eOtherInclude.Get("none") { - for i, base := range bases { - pkg := base.Pkgbase() - anyInstalled := base.AnyIsInSet(installed) - - if !eIsInclude && eExclude.Get(len(bases)-i) { - continue - } - - if anyInstalled && (eOtherInclude.Get("i") || eOtherInclude.Get("installed")) { - toEdit = append(toEdit, base) - continue - } - - if !anyInstalled && (eOtherInclude.Get("no") || eOtherInclude.Get("notinstalled")) { - toEdit = append(toEdit, base) - continue - } - - if eOtherInclude.Get("a") || eOtherInclude.Get("all") { - toEdit = append(toEdit, base) - continue - } - - if eIsInclude && (eInclude.Get(len(bases)-i) || eOtherInclude.Get(pkg)) { - toEdit = append(toEdit, base) - } - - if !eIsInclude && (!eExclude.Get(len(bases)-i) && !eOtherExclude.Get(pkg)) { - toEdit = append(toEdit, base) - } - } - } - - return toEdit, nil -} - -func editPkgbuilds(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo) error { +func editPkgbuilds(buildDir string, bases []dep.Base, editorConfig, + editorFlags string, srcinfos map[string]*gosrc.Srcinfo, noConfirm bool) error { pkgbuilds := make([]string, 0, len(bases)) for _, base := range bases { pkg := base.Pkgbase() - dir := filepath.Join(config.BuildDir, pkg) + dir := filepath.Join(buildDir, pkg) pkgbuilds = append(pkgbuilds, filepath.Join(dir, "PKGBUILD")) for _, splitPkg := range srcinfos[pkg].SplitPackages() { @@ -171,7 +103,7 @@ func editPkgbuilds(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo) error { } if len(pkgbuilds) > 0 { - editor, editorArgs := editor() + editor, editorArgs := editor(editorConfig, editorFlags, noConfirm) editorArgs = append(editorArgs, pkgbuilds...) editcmd := exec.Command(editor, editorArgs...) editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr @@ -184,19 +116,21 @@ func editPkgbuilds(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo) error { return nil } -func editMenu(editMenuOption bool, bases []dep.Base, installed stringset.StringSet, srcinfos map[string]*gosrc.Srcinfo) error { +func Edit(editMenuOption bool, buildDir string, bases []dep.Base, editorConfig, + editorFlags string, installed stringset.StringSet, srcinfos map[string]*gosrc.Srcinfo, + noConfirm bool, editDefaultAnswer string) error { if !editMenuOption { return nil } - pkgbuildNumberMenu(bases, installed) + pkgbuildNumberMenu(buildDir, bases, installed) - toEdit, errMenu := editNumberMenu(bases, installed) + toEdit, errMenu := editNumberMenu(bases, installed, noConfirm, editDefaultAnswer) if errMenu != nil || len(toEdit) == 0 { return errMenu } - if errEdit := editPkgbuilds(toEdit, srcinfos); errEdit != nil { + if errEdit := editPkgbuilds(buildDir, toEdit, editorConfig, editorFlags, srcinfos, noConfirm); errEdit != nil { return errEdit } diff --git a/pkg/menus/menu.go b/pkg/menus/menu.go new file mode 100644 index 0000000..848d24a --- /dev/null +++ b/pkg/menus/menu.go @@ -0,0 +1,107 @@ +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" +) + +func pkgbuildNumberMenu(buildDir string, bases []dep.Base, installed stringset.StringSet) { + toPrint := "" + + for n, base := range bases { + pkg := base.Pkgbase() + dir := filepath.Join(buildDir, pkg) + + toPrint += fmt.Sprintf(text.Magenta("%3d")+" %-40s", len(bases)-n, + text.Bold(base.String())) + + if base.AnyIsInSet(installed) { + toPrint += text.Bold(text.Green(gotext.Get(" (Installed)"))) + } + + if _, err := os.Stat(dir); !os.IsNotExist(err) { + toPrint += text.Bold(text.Green(gotext.Get(" (Build Files Exist)"))) + } + + toPrint += "\n" + } + + fmt.Print(toPrint) +} + +func editDiffNumberMenu(bases []dep.Base, installed stringset.StringSet, diff, noConfirm bool, defaultAnswer string) ([]dep.Base, error) { + var ( + toEdit = make([]dep.Base, 0) + editInput string + err error + ) + + if diff { + text.Infoln(gotext.Get("Diffs to show?")) + 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")))) + + editInput, err = text.GetInput(defaultAnswer, noConfirm) + if err != nil { + return nil, err + } + } else { + text.Infoln(gotext.Get("PKGBUILDs to edit?")) + 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")))) + editInput, err = text.GetInput(defaultAnswer, noConfirm) + if err != nil { + return nil, err + } + } + + eInclude, eExclude, eOtherInclude, eOtherExclude := intrange.ParseNumberMenu(editInput) + eIsInclude := len(eExclude) == 0 && len(eOtherExclude) == 0 + + if eOtherInclude.Get("abort") || eOtherInclude.Get("ab") { + return nil, &settings.ErrUserAbort{} + } + + if !eOtherInclude.Get("n") && !eOtherInclude.Get("none") { + for i, base := range bases { + pkg := base.Pkgbase() + anyInstalled := base.AnyIsInSet(installed) + + if !eIsInclude && eExclude.Get(len(bases)-i) { + continue + } + + if anyInstalled && (eOtherInclude.Get("i") || eOtherInclude.Get("installed")) { + toEdit = append(toEdit, base) + continue + } + + if !anyInstalled && (eOtherInclude.Get("no") || eOtherInclude.Get("notinstalled")) { + toEdit = append(toEdit, base) + continue + } + + if eOtherInclude.Get("a") || eOtherInclude.Get("all") { + toEdit = append(toEdit, base) + continue + } + + if eIsInclude && (eInclude.Get(len(bases)-i) || eOtherInclude.Get(pkg)) { + toEdit = append(toEdit, base) + } + + if !eIsInclude && (!eExclude.Get(len(bases)-i) && !eOtherExclude.Get(pkg)) { + toEdit = append(toEdit, base) + } + } + } + + return toEdit, nil +} diff --git a/pkg/text/input.go b/pkg/text/input.go new file mode 100644 index 0000000..fe1f0eb --- /dev/null +++ b/pkg/text/input.go @@ -0,0 +1,31 @@ +package text + +import ( + "bufio" + "fmt" + "os" + + "github.com/leonelquinteros/gotext" +) + +func GetInput(defaultValue string, noConfirm bool) (string, error) { + Info() + + if defaultValue != "" || noConfirm { + fmt.Println(defaultValue) + return defaultValue, nil + } + + reader := bufio.NewReader(os.Stdin) + + buf, overflow, err := reader.ReadLine() + if err != nil { + return "", err + } + + if overflow { + return "", fmt.Errorf(gotext.Get("input too long")) + } + + return string(buf), nil +} diff --git a/upgrade.go b/upgrade.go index 70b255b..890f5c8 100644 --- a/upgrade.go +++ b/upgrade.go @@ -15,6 +15,7 @@ import ( "github.com/Jguer/yay/v11/pkg/intrange" "github.com/Jguer/yay/v11/pkg/multierror" "github.com/Jguer/yay/v11/pkg/query" + "github.com/Jguer/yay/v11/pkg/settings" "github.com/Jguer/yay/v11/pkg/stringset" "github.com/Jguer/yay/v11/pkg/text" "github.com/Jguer/yay/v11/pkg/upgrade" @@ -184,7 +185,7 @@ func upgradePkgsMenu(aurUp, repoUp upgrade.UpSlice) (stringset.StringSet, []stri text.Infoln(gotext.Get("Packages to exclude: (eg: \"1 2 3\", \"1-3\", \"^4\" or repo name)")) - numbers, err := getInput(config.AnswerUpgrade) + numbers, err := text.GetInput(config.AnswerUpgrade, settings.NoConfirm) if err != nil { return nil, nil, err }