mirror of
https://github.com/Jguer/yay
synced 2024-10-05 23:59:13 +00:00
feat(menus): extract menus package
This commit is contained in:
parent
6364b4efe8
commit
d096d15973
29
config.go
29
config.go
|
@ -1,14 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/leonelquinteros/gotext"
|
|
||||||
|
|
||||||
"github.com/Jguer/yay/v11/pkg/settings"
|
"github.com/Jguer/yay/v11/pkg/settings"
|
||||||
"github.com/Jguer/yay/v11/pkg/text"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Verbosity settings for search.
|
// Verbosity settings for search.
|
||||||
|
@ -24,25 +17,3 @@ var localePath = "/usr/share/locale"
|
||||||
|
|
||||||
// YayConf holds the current config values for yay.
|
// YayConf holds the current config values for yay.
|
||||||
var config *settings.Configuration
|
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
|
|
||||||
}
|
|
||||||
|
|
39
install.go
39
install.go
|
@ -18,6 +18,7 @@ import (
|
||||||
"github.com/Jguer/yay/v11/pkg/db"
|
"github.com/Jguer/yay/v11/pkg/db"
|
||||||
"github.com/Jguer/yay/v11/pkg/dep"
|
"github.com/Jguer/yay/v11/pkg/dep"
|
||||||
"github.com/Jguer/yay/v11/pkg/download"
|
"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/pgp"
|
||||||
"github.com/Jguer/yay/v11/pkg/query"
|
"github.com/Jguer/yay/v11/pkg/query"
|
||||||
"github.com/Jguer/yay/v11/pkg/settings"
|
"github.com/Jguer/yay/v11/pkg/settings"
|
||||||
|
@ -26,8 +27,6 @@ import (
|
||||||
"github.com/Jguer/yay/v11/pkg/text"
|
"github.com/Jguer/yay/v11/pkg/text"
|
||||||
)
|
)
|
||||||
|
|
||||||
const gitEmptyTree = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
|
|
||||||
|
|
||||||
func asdeps(ctx context.Context, cmdArgs *parser.Arguments, pkgs []string) (err error) {
|
func asdeps(ctx context.Context, cmdArgs *parser.Arguments, pkgs []string) (err error) {
|
||||||
if len(pkgs) == 0 {
|
if len(pkgs) == 0 {
|
||||||
return nil
|
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{}) {
|
if errors.As(errCleanMenu, &settings.ErrUserAbort{}) {
|
||||||
return errCleanMenu
|
return errCleanMenu
|
||||||
}
|
}
|
||||||
|
@ -248,7 +249,9 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu
|
||||||
return errA
|
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{}) {
|
if errors.As(errDiffMenu, &settings.ErrUserAbort{}) {
|
||||||
return errDiffMenu
|
return errDiffMenu
|
||||||
}
|
}
|
||||||
|
@ -265,7 +268,9 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu
|
||||||
return err
|
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{}) {
|
if errors.As(errEditMenu, &settings.ErrUserAbort{}) {
|
||||||
return errEditMenu
|
return errEditMenu
|
||||||
}
|
}
|
||||||
|
@ -502,30 +507,6 @@ func parsePackageList(ctx context.Context, dir string) (pkgdests map[string]stri
|
||||||
return pkgdests, pkgVersion, nil
|
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) {
|
func parseSrcinfoFiles(bases []dep.Base, errIsFatal bool) (map[string]*gosrc.Srcinfo, error) {
|
||||||
srcinfos := make(map[string]*gosrc.Srcinfo)
|
srcinfos := make(map[string]*gosrc.Srcinfo)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Clean Build Menu functions
|
// Clean Build Menu functions
|
||||||
package main
|
package menus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -15,13 +15,14 @@ import (
|
||||||
"github.com/Jguer/yay/v11/pkg/text"
|
"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)
|
toClean := make([]dep.Base, 0)
|
||||||
|
|
||||||
text.Infoln(gotext.Get("Packages to cleanBuild?"))
|
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"))))
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -38,7 +39,7 @@ func cleanNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Bas
|
||||||
pkg := base.Pkgbase()
|
pkg := base.Pkgbase()
|
||||||
anyInstalled := base.AnyIsInSet(installed)
|
anyInstalled := base.AnyIsInSet(installed)
|
||||||
|
|
||||||
dir := filepath.Join(config.BuildDir, pkg)
|
dir := filepath.Join(buildDir, pkg)
|
||||||
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
if _, err := os.Stat(dir); os.IsNotExist(err) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -77,10 +78,10 @@ func cleanNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Bas
|
||||||
return toClean, nil
|
return toClean, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func anyExistInCache(bases []dep.Base) bool {
|
func anyExistInCache(buildDir string, bases []dep.Base) bool {
|
||||||
for _, base := range bases {
|
for _, base := range bases {
|
||||||
pkg := base.Pkgbase()
|
pkg := base.Pkgbase()
|
||||||
dir := filepath.Join(config.BuildDir, pkg)
|
dir := filepath.Join(buildDir, pkg)
|
||||||
|
|
||||||
if _, err := os.Stat(dir); !os.IsNotExist(err) {
|
if _, err := os.Stat(dir); !os.IsNotExist(err) {
|
||||||
return true
|
return true
|
||||||
|
@ -90,20 +91,21 @@ func anyExistInCache(bases []dep.Base) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func cleanMenu(cleanMenuOption bool, aurBases []dep.Base, installed stringset.StringSet) error {
|
func Clean(cleanMenuOption bool, buildDir string, aurBases []dep.Base,
|
||||||
if !(cleanMenuOption && anyExistInCache(aurBases)) {
|
installed stringset.StringSet, noConfirm bool, answerClean string) error {
|
||||||
|
if !(cleanMenuOption && anyExistInCache(buildDir, aurBases)) {
|
||||||
return nil
|
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 {
|
if errClean != nil {
|
||||||
return errClean
|
return errClean
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, base := range toClean {
|
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)))
|
text.OperationInfoln(gotext.Get("Deleting (%d/%d): %s", i+1, len(toClean), text.Cyan(dir)))
|
||||||
|
|
||||||
if err := os.RemoveAll(dir); err != nil {
|
if err := os.RemoveAll(dir); err != nil {
|
|
@ -1,5 +1,5 @@
|
||||||
// file dedicated to diff menu
|
// file dedicated to diff menu
|
||||||
package main
|
package menus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
@ -12,20 +12,24 @@ import (
|
||||||
"github.com/Jguer/yay/v11/pkg/dep"
|
"github.com/Jguer/yay/v11/pkg/dep"
|
||||||
"github.com/Jguer/yay/v11/pkg/multierror"
|
"github.com/Jguer/yay/v11/pkg/multierror"
|
||||||
"github.com/Jguer/yay/v11/pkg/settings"
|
"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/stringset"
|
||||||
"github.com/Jguer/yay/v11/pkg/text"
|
"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
|
var errMulti multierror.MultiError
|
||||||
|
|
||||||
for _, base := range bases {
|
for _, base := range bases {
|
||||||
pkg := base.Pkgbase()
|
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 {
|
if err != nil {
|
||||||
errMulti.Add(err)
|
errMulti.Add(err)
|
||||||
|
|
||||||
|
@ -35,7 +39,7 @@ func showPkgbuildDiffs(ctx context.Context, bases []dep.Base, cloned map[string]
|
||||||
if cloned[pkg] {
|
if cloned[pkg] {
|
||||||
start = gitEmptyTree
|
start = gitEmptyTree
|
||||||
} else {
|
} else {
|
||||||
hasDiff, err := gitHasDiff(ctx, config.BuildDir, pkg)
|
hasDiff, err := gitHasDiff(ctx, cmdBuilder, buildDir, pkg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errMulti.Add(err)
|
errMulti.Add(err)
|
||||||
|
|
||||||
|
@ -60,7 +64,7 @@ func showPkgbuildDiffs(ctx context.Context, bases []dep.Base, cloned map[string]
|
||||||
args = append(args, "--color=never")
|
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()
|
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
|
// Check whether or not a diff exists between the last reviewed diff and
|
||||||
// HEAD@{upstream}.
|
// HEAD@{upstream}.
|
||||||
func gitHasDiff(ctx context.Context, path, name string) (bool, error) {
|
func gitHasDiff(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) (bool, error) {
|
||||||
if gitHasLastSeenRef(ctx, path, name) {
|
if gitHasLastSeenRef(ctx, cmdBuilder, path, name) {
|
||||||
stdout, stderr, err := config.Runtime.CmdBuilder.Capture(
|
stdout, stderr, err := cmdBuilder.Capture(
|
||||||
config.Runtime.CmdBuilder.BuildGitCmd(ctx, filepath.Join(path, name), "rev-parse", gitDiffRefName, "HEAD@{upstream}"))
|
cmdBuilder.BuildGitCmd(ctx, filepath.Join(path, name), "rev-parse", gitDiffRefName, "HEAD@{upstream}"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("%s%s", stderr, err)
|
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
|
// Return wether or not we have reviewed a diff yet. It checks for the existence of
|
||||||
// YAY_DIFF_REVIEW in the git ref-list.
|
// YAY_DIFF_REVIEW in the git ref-list.
|
||||||
func gitHasLastSeenRef(ctx context.Context, path, name string) bool {
|
func gitHasLastSeenRef(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) bool {
|
||||||
_, _, err := config.Runtime.CmdBuilder.Capture(
|
_, _, err := cmdBuilder.Capture(
|
||||||
config.Runtime.CmdBuilder.BuildGitCmd(ctx,
|
cmdBuilder.BuildGitCmd(ctx,
|
||||||
filepath.Join(path, name), "rev-parse", "--quiet", "--verify", gitDiffRefName))
|
filepath.Join(path, name), "rev-parse", "--quiet", "--verify", gitDiffRefName))
|
||||||
|
|
||||||
return err == nil
|
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.
|
// 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.
|
// 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) {
|
func getLastSeenHash(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) (string, error) {
|
||||||
if gitHasLastSeenRef(ctx, path, name) {
|
if gitHasLastSeenRef(ctx, cmdBuilder, path, name) {
|
||||||
stdout, stderr, err := config.Runtime.CmdBuilder.Capture(
|
stdout, stderr, err := cmdBuilder.Capture(
|
||||||
config.Runtime.CmdBuilder.BuildGitCmd(ctx,
|
cmdBuilder.BuildGitCmd(ctx,
|
||||||
filepath.Join(path, name), "rev-parse", gitDiffRefName))
|
filepath.Join(path, name), "rev-parse", gitDiffRefName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("%s %s", stderr, err)
|
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
|
// Update the YAY_DIFF_REVIEW ref to HEAD. We use this ref to determine which diff were
|
||||||
// reviewed by the user.
|
// reviewed by the user.
|
||||||
func gitUpdateSeenRef(ctx context.Context, path, name string) error {
|
func gitUpdateSeenRef(ctx context.Context, cmdBuilder exe.ICmdBuilder, path, name string) error {
|
||||||
_, stderr, err := config.Runtime.CmdBuilder.Capture(
|
_, stderr, err := cmdBuilder.Capture(
|
||||||
config.Runtime.CmdBuilder.BuildGitCmd(ctx,
|
cmdBuilder.BuildGitCmd(ctx,
|
||||||
filepath.Join(path, name), "update-ref", gitDiffRefName, "HEAD"))
|
filepath.Join(path, name), "update-ref", gitDiffRefName, "HEAD"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%s %s", stderr, err)
|
return fmt.Errorf("%s %s", stderr, err)
|
||||||
|
@ -129,17 +133,17 @@ func gitUpdateSeenRef(ctx context.Context, path, name string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func diffNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) {
|
func diffNumberMenu(bases []dep.Base, installed stringset.StringSet, noConfirm bool, defaultAnswer string) ([]dep.Base, error) {
|
||||||
return editDiffNumberMenu(bases, installed, true)
|
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
|
var errMulti multierror.MultiError
|
||||||
|
|
||||||
for _, base := range bases {
|
for _, base := range bases {
|
||||||
pkg := base.Pkgbase()
|
pkg := base.Pkgbase()
|
||||||
|
|
||||||
if err := gitUpdateSeenRef(ctx, config.BuildDir, pkg); err != nil {
|
if err := gitUpdateSeenRef(ctx, cmdBuilder, buildDir, pkg); err != nil {
|
||||||
errMulti.Add(err)
|
errMulti.Add(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,19 +151,21 @@ func updatePkgbuildSeenRef(ctx context.Context, bases []dep.Base) error {
|
||||||
return errMulti.Return()
|
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 {
|
if !diffMenuOption {
|
||||||
return nil
|
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 {
|
if errMenu != nil || len(toDiff) == 0 {
|
||||||
return errMenu
|
return errMenu
|
||||||
}
|
}
|
||||||
|
|
||||||
if errD := showPkgbuildDiffs(ctx, toDiff, cloned); errD != nil {
|
if errD := showPkgbuildDiffs(ctx, cmdBuilder, buildDir, toDiff, cloned); errD != nil {
|
||||||
return errD
|
return errD
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +175,7 @@ func diffMenu(ctx context.Context, diffMenuOption bool, bases []dep.Base, instal
|
||||||
return settings.ErrUserAbort{}
|
return settings.ErrUserAbort{}
|
||||||
}
|
}
|
||||||
|
|
||||||
if errUpd := updatePkgbuildSeenRef(ctx, toDiff); errUpd != nil {
|
if errUpd := updatePkgbuildSeenRef(ctx, cmdBuilder, buildDir, toDiff); errUpd != nil {
|
||||||
return errUpd
|
return errUpd
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// edit menu
|
// edit menu
|
||||||
package main
|
package menus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
@ -13,21 +13,20 @@ import (
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
|
|
||||||
"github.com/Jguer/yay/v11/pkg/dep"
|
"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/settings"
|
||||||
"github.com/Jguer/yay/v11/pkg/stringset"
|
"github.com/Jguer/yay/v11/pkg/stringset"
|
||||||
"github.com/Jguer/yay/v11/pkg/text"
|
"github.com/Jguer/yay/v11/pkg/text"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Editor returns the preferred system editor.
|
// Editor returns the preferred system editor.
|
||||||
func editor() (editor string, args []string) {
|
func editor(editorConfig, editorFlags string, noConfirm bool) (editor string, args []string) {
|
||||||
switch {
|
switch {
|
||||||
case config.Editor != "":
|
case editorConfig != "":
|
||||||
editor, err := exec.LookPath(config.Editor)
|
editor, err := exec.LookPath(editorConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err)
|
fmt.Fprintln(os.Stderr, err)
|
||||||
} else {
|
} else {
|
||||||
return editor, strings.Fields(config.EditorFlags)
|
return editor, strings.Fields(editorFlags)
|
||||||
}
|
}
|
||||||
|
|
||||||
fallthrough
|
fallthrough
|
||||||
|
@ -61,7 +60,7 @@ func editor() (editor string, args []string) {
|
||||||
for {
|
for {
|
||||||
text.Infoln(gotext.Get("Edit PKGBUILD with?"))
|
text.Infoln(gotext.Get("Edit PKGBUILD with?"))
|
||||||
|
|
||||||
editorInput, err := getInput("")
|
editorInput, err := text.GetInput("", noConfirm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err)
|
fmt.Fprintln(os.Stderr, err)
|
||||||
continue
|
continue
|
||||||
|
@ -83,84 +82,17 @@ func editor() (editor string, args []string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func editNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) {
|
func editNumberMenu(bases []dep.Base, installed stringset.StringSet, noConfirm bool, defaultAnswer string) ([]dep.Base, error) {
|
||||||
return editDiffNumberMenu(bases, installed, false)
|
return editDiffNumberMenu(bases, installed, false, noConfirm, defaultAnswer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func editDiffNumberMenu(bases []dep.Base, installed stringset.StringSet, diff bool) ([]dep.Base, error) {
|
func editPkgbuilds(buildDir string, bases []dep.Base, editorConfig,
|
||||||
var (
|
editorFlags string, srcinfos map[string]*gosrc.Srcinfo, noConfirm bool) error {
|
||||||
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 {
|
|
||||||
pkgbuilds := make([]string, 0, len(bases))
|
pkgbuilds := make([]string, 0, len(bases))
|
||||||
|
|
||||||
for _, base := range bases {
|
for _, base := range bases {
|
||||||
pkg := base.Pkgbase()
|
pkg := base.Pkgbase()
|
||||||
dir := filepath.Join(config.BuildDir, pkg)
|
dir := filepath.Join(buildDir, pkg)
|
||||||
pkgbuilds = append(pkgbuilds, filepath.Join(dir, "PKGBUILD"))
|
pkgbuilds = append(pkgbuilds, filepath.Join(dir, "PKGBUILD"))
|
||||||
|
|
||||||
for _, splitPkg := range srcinfos[pkg].SplitPackages() {
|
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 {
|
if len(pkgbuilds) > 0 {
|
||||||
editor, editorArgs := editor()
|
editor, editorArgs := editor(editorConfig, editorFlags, noConfirm)
|
||||||
editorArgs = append(editorArgs, pkgbuilds...)
|
editorArgs = append(editorArgs, pkgbuilds...)
|
||||||
editcmd := exec.Command(editor, editorArgs...)
|
editcmd := exec.Command(editor, editorArgs...)
|
||||||
editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
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
|
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 {
|
if !editMenuOption {
|
||||||
return nil
|
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 {
|
if errMenu != nil || len(toEdit) == 0 {
|
||||||
return errMenu
|
return errMenu
|
||||||
}
|
}
|
||||||
|
|
||||||
if errEdit := editPkgbuilds(toEdit, srcinfos); errEdit != nil {
|
if errEdit := editPkgbuilds(buildDir, toEdit, editorConfig, editorFlags, srcinfos, noConfirm); errEdit != nil {
|
||||||
return errEdit
|
return errEdit
|
||||||
}
|
}
|
||||||
|
|
107
pkg/menus/menu.go
Normal file
107
pkg/menus/menu.go
Normal file
|
@ -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
|
||||||
|
}
|
31
pkg/text/input.go
Normal file
31
pkg/text/input.go
Normal file
|
@ -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
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/Jguer/yay/v11/pkg/intrange"
|
"github.com/Jguer/yay/v11/pkg/intrange"
|
||||||
"github.com/Jguer/yay/v11/pkg/multierror"
|
"github.com/Jguer/yay/v11/pkg/multierror"
|
||||||
"github.com/Jguer/yay/v11/pkg/query"
|
"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/stringset"
|
||||||
"github.com/Jguer/yay/v11/pkg/text"
|
"github.com/Jguer/yay/v11/pkg/text"
|
||||||
"github.com/Jguer/yay/v11/pkg/upgrade"
|
"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)"))
|
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 {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue