Skip to content

Commit

Permalink
feat(menus): extract menus package
Browse files Browse the repository at this point in the history
Jguer committed Oct 27, 2021
1 parent 6364b4e commit d096d15
Showing 8 changed files with 217 additions and 184 deletions.
29 changes: 0 additions & 29 deletions config.go
Original file line number Diff line number Diff line change
@@ -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
}
39 changes: 10 additions & 29 deletions install.go
Original file line number Diff line number Diff line change
@@ -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)

24 changes: 13 additions & 11 deletions clean_menu.go → pkg/menus/clean_menu.go
Original file line number Diff line number Diff line change
@@ -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 {
66 changes: 36 additions & 30 deletions diff_menu.go → pkg/menus/diff_menu.go
Original file line number Diff line number Diff line change
@@ -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,18 +64,18 @@ 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()
}

// 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,20 +93,20 @@ 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
}

// 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,37 +133,39 @@ 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)
}
}

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
}

Loading
Oops, something went wrong.

0 comments on commit d096d15

Please sign in to comment.