mirror of
https://github.com/Jguer/yay
synced 2024-10-05 23:59:13 +00:00
fix(menus): improve edit and diff menu structure
This commit is contained in:
parent
f3c3e2e4d4
commit
6364b4efe8
66
config.go
66
config.go
|
@ -4,8 +4,6 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
|
|
||||||
|
@ -27,70 +25,6 @@ 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
|
||||||
|
|
||||||
// Editor returns the preferred system editor.
|
|
||||||
func editor() (editor string, args []string) {
|
|
||||||
switch {
|
|
||||||
case config.Editor != "":
|
|
||||||
editor, err := exec.LookPath(config.Editor)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
} else {
|
|
||||||
return editor, strings.Fields(config.EditorFlags)
|
|
||||||
}
|
|
||||||
|
|
||||||
fallthrough
|
|
||||||
case os.Getenv("EDITOR") != "":
|
|
||||||
if editorArgs := strings.Fields(os.Getenv("EDITOR")); len(editorArgs) != 0 {
|
|
||||||
editor, err := exec.LookPath(editorArgs[0])
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
} else {
|
|
||||||
return editor, editorArgs[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fallthrough
|
|
||||||
case os.Getenv("VISUAL") != "":
|
|
||||||
if editorArgs := strings.Fields(os.Getenv("VISUAL")); len(editorArgs) != 0 {
|
|
||||||
editor, err := exec.LookPath(editorArgs[0])
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
} else {
|
|
||||||
return editor, editorArgs[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fallthrough
|
|
||||||
default:
|
|
||||||
fmt.Fprintln(os.Stderr)
|
|
||||||
text.Errorln(gotext.Get("%s is not set", text.Bold(text.Cyan("$EDITOR"))))
|
|
||||||
text.Warnln(gotext.Get("Add %s or %s to your environment variables", text.Bold(text.Cyan("$EDITOR")), text.Bold(text.Cyan("$VISUAL"))))
|
|
||||||
|
|
||||||
for {
|
|
||||||
text.Infoln(gotext.Get("Edit PKGBUILD with?"))
|
|
||||||
|
|
||||||
editorInput, err := getInput("")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
editorArgs := strings.Fields(editorInput)
|
|
||||||
if len(editorArgs) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
editor, err := exec.LookPath(editorArgs[0])
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
return editor, editorArgs[1:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getInput(defaultValue string) (string, error) {
|
func getInput(defaultValue string) (string, error) {
|
||||||
text.Info()
|
text.Info()
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// file dedicated to diff menu
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -10,6 +11,8 @@ 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/stringset"
|
||||||
"github.com/Jguer/yay/v11/pkg/text"
|
"github.com/Jguer/yay/v11/pkg/text"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -126,19 +129,48 @@ func gitUpdateSeenRef(ctx context.Context, path, name string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func gitMerge(ctx context.Context, path, name string) error {
|
func diffNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) {
|
||||||
_, stderr, err := config.Runtime.CmdBuilder.Capture(
|
return editDiffNumberMenu(bases, installed, true)
|
||||||
config.Runtime.CmdBuilder.BuildGitCmd(ctx,
|
}
|
||||||
filepath.Join(path, name), "reset", "--hard", "HEAD"))
|
|
||||||
if err != nil {
|
func updatePkgbuildSeenRef(ctx context.Context, bases []dep.Base) error {
|
||||||
return fmt.Errorf(gotext.Get("error resetting %s: %s", name, stderr))
|
var errMulti multierror.MultiError
|
||||||
|
|
||||||
|
for _, base := range bases {
|
||||||
|
pkg := base.Pkgbase()
|
||||||
|
|
||||||
|
if err := gitUpdateSeenRef(ctx, config.BuildDir, pkg); err != nil {
|
||||||
|
errMulti.Add(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_, stderr, err = config.Runtime.CmdBuilder.Capture(
|
return errMulti.Return()
|
||||||
config.Runtime.CmdBuilder.BuildGitCmd(ctx,
|
}
|
||||||
filepath.Join(path, name), "merge", "--no-edit", "--ff"))
|
|
||||||
if err != nil {
|
func diffMenu(ctx context.Context, diffMenuOption bool, bases []dep.Base, installed stringset.StringSet, cloned map[string]bool) error {
|
||||||
return fmt.Errorf(gotext.Get("error merging %s: %s", name, stderr))
|
if !diffMenuOption {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
pkgbuildNumberMenu(bases, installed)
|
||||||
|
|
||||||
|
toDiff, errMenu := diffNumberMenu(bases, installed)
|
||||||
|
if errMenu != nil || len(toDiff) == 0 {
|
||||||
|
return errMenu
|
||||||
|
}
|
||||||
|
|
||||||
|
if errD := showPkgbuildDiffs(ctx, toDiff, cloned); errD != nil {
|
||||||
|
return errD
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
|
if !text.ContinueTask(gotext.Get("Proceed with install?"), true, false) {
|
||||||
|
return settings.ErrUserAbort{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if errUpd := updatePkgbuildSeenRef(ctx, toDiff); errUpd != nil {
|
||||||
|
return errUpd
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
210
edit_menu.go
Normal file
210
edit_menu.go
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
// edit menu
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
gosrc "github.com/Morganamilo/go-srcinfo"
|
||||||
|
"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) {
|
||||||
|
switch {
|
||||||
|
case config.Editor != "":
|
||||||
|
editor, err := exec.LookPath(config.Editor)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err)
|
||||||
|
} else {
|
||||||
|
return editor, strings.Fields(config.EditorFlags)
|
||||||
|
}
|
||||||
|
|
||||||
|
fallthrough
|
||||||
|
case os.Getenv("EDITOR") != "":
|
||||||
|
if editorArgs := strings.Fields(os.Getenv("EDITOR")); len(editorArgs) != 0 {
|
||||||
|
editor, err := exec.LookPath(editorArgs[0])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err)
|
||||||
|
} else {
|
||||||
|
return editor, editorArgs[1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fallthrough
|
||||||
|
case os.Getenv("VISUAL") != "":
|
||||||
|
if editorArgs := strings.Fields(os.Getenv("VISUAL")); len(editorArgs) != 0 {
|
||||||
|
editor, err := exec.LookPath(editorArgs[0])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err)
|
||||||
|
} else {
|
||||||
|
return editor, editorArgs[1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fallthrough
|
||||||
|
default:
|
||||||
|
fmt.Fprintln(os.Stderr)
|
||||||
|
text.Errorln(gotext.Get("%s is not set", text.Bold(text.Cyan("$EDITOR"))))
|
||||||
|
text.Warnln(gotext.Get("Add %s or %s to your environment variables", text.Bold(text.Cyan("$EDITOR")), text.Bold(text.Cyan("$VISUAL"))))
|
||||||
|
|
||||||
|
for {
|
||||||
|
text.Infoln(gotext.Get("Edit PKGBUILD with?"))
|
||||||
|
|
||||||
|
editorInput, err := getInput("")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
editorArgs := strings.Fields(editorInput)
|
||||||
|
if len(editorArgs) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
editor, err := exec.LookPath(editorArgs[0])
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
return editor, editorArgs[1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func editNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) {
|
||||||
|
return editDiffNumberMenu(bases, installed, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
||||||
|
pkgbuilds := make([]string, 0, len(bases))
|
||||||
|
|
||||||
|
for _, base := range bases {
|
||||||
|
pkg := base.Pkgbase()
|
||||||
|
dir := filepath.Join(config.BuildDir, pkg)
|
||||||
|
pkgbuilds = append(pkgbuilds, filepath.Join(dir, "PKGBUILD"))
|
||||||
|
|
||||||
|
for _, splitPkg := range srcinfos[pkg].SplitPackages() {
|
||||||
|
if splitPkg.Install != "" {
|
||||||
|
pkgbuilds = append(pkgbuilds, filepath.Join(dir, splitPkg.Install))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(pkgbuilds) > 0 {
|
||||||
|
editor, editorArgs := editor()
|
||||||
|
editorArgs = append(editorArgs, pkgbuilds...)
|
||||||
|
editcmd := exec.Command(editor, editorArgs...)
|
||||||
|
editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
||||||
|
|
||||||
|
if err := editcmd.Run(); err != nil {
|
||||||
|
return errors.New(gotext.Get("editor did not exit successfully, aborting: %s", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func editMenu(editMenuOption bool, bases []dep.Base, installed stringset.StringSet, srcinfos map[string]*gosrc.Srcinfo) error {
|
||||||
|
if !editMenuOption {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
pkgbuildNumberMenu(bases, installed)
|
||||||
|
|
||||||
|
toEdit, errMenu := editNumberMenu(bases, installed)
|
||||||
|
if errMenu != nil || len(toEdit) == 0 {
|
||||||
|
return errMenu
|
||||||
|
}
|
||||||
|
|
||||||
|
if errEdit := editPkgbuilds(toEdit, srcinfos); errEdit != nil {
|
||||||
|
return errEdit
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
|
if !text.ContinueTask(gotext.Get("Proceed with install?"), true, false) {
|
||||||
|
return settings.ErrUserAbort{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
205
install.go
205
install.go
|
@ -5,7 +5,6 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -19,8 +18,6 @@ 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/intrange"
|
|
||||||
"github.com/Jguer/yay/v11/pkg/multierror"
|
|
||||||
"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"
|
||||||
|
@ -251,40 +248,12 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu
|
||||||
return errA
|
return errA
|
||||||
}
|
}
|
||||||
|
|
||||||
var toDiff, toEdit []dep.Base
|
if errDiffMenu := diffMenu(ctx, config.DiffMenu, do.Aur, remoteNamesCache, cloned); errDiffMenu != nil {
|
||||||
|
if errors.As(errDiffMenu, &settings.ErrUserAbort{}) {
|
||||||
if config.DiffMenu {
|
return errDiffMenu
|
||||||
pkgbuildNumberMenu(do.Aur, remoteNamesCache)
|
|
||||||
|
|
||||||
toDiff, err = diffNumberMenu(do.Aur, remoteNamesCache)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(toDiff) > 0 {
|
text.Errorln(errDiffMenu)
|
||||||
err = showPkgbuildDiffs(ctx, toDiff, cloned)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(toDiff) > 0 {
|
|
||||||
oldValue := settings.NoConfirm
|
|
||||||
settings.NoConfirm = false
|
|
||||||
|
|
||||||
fmt.Println()
|
|
||||||
|
|
||||||
if !text.ContinueTask(gotext.Get("Proceed with install?"), true, settings.NoConfirm) {
|
|
||||||
return &settings.ErrUserAbort{}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = updatePkgbuildSeenRef(ctx, toDiff)
|
|
||||||
if err != nil {
|
|
||||||
text.Errorln(err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.NoConfirm = oldValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if errM := mergePkgbuilds(ctx, do.Aur); errM != nil {
|
if errM := mergePkgbuilds(ctx, do.Aur); errM != nil {
|
||||||
|
@ -296,33 +265,12 @@ func install(ctx context.Context, cmdArgs *parser.Arguments, dbExecutor db.Execu
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.EditMenu {
|
if errEditMenu := editMenu(config.EditMenu, do.Aur, remoteNamesCache, srcinfos); errEditMenu != nil {
|
||||||
pkgbuildNumberMenu(do.Aur, remoteNamesCache)
|
if errors.As(errEditMenu, &settings.ErrUserAbort{}) {
|
||||||
|
return errEditMenu
|
||||||
toEdit, err = editNumberMenu(do.Aur, remoteNamesCache)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(toEdit) > 0 {
|
text.Errorln(errEditMenu)
|
||||||
err = editPkgbuilds(toEdit, srcinfos)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(toEdit) > 0 {
|
|
||||||
oldValue := settings.NoConfirm
|
|
||||||
settings.NoConfirm = false
|
|
||||||
|
|
||||||
fmt.Println()
|
|
||||||
|
|
||||||
if !text.ContinueTask(gotext.Get("Proceed with install?"), true, settings.NoConfirm) {
|
|
||||||
return &settings.ErrUserAbort{}
|
|
||||||
}
|
|
||||||
|
|
||||||
settings.NoConfirm = oldValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
incompatible, err = getIncompatible(do.Aur, srcinfos, dbExecutor)
|
incompatible, err = getIncompatible(do.Aur, srcinfos, dbExecutor)
|
||||||
|
@ -578,125 +526,6 @@ func pkgbuildNumberMenu(bases []dep.Base, installed stringset.StringSet) {
|
||||||
fmt.Print(toPrint)
|
fmt.Print(toPrint)
|
||||||
}
|
}
|
||||||
|
|
||||||
func editNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) {
|
|
||||||
return editDiffNumberMenu(bases, installed, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
func diffNumberMenu(bases []dep.Base, installed stringset.StringSet) ([]dep.Base, error) {
|
|
||||||
return editDiffNumberMenu(bases, installed, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
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 updatePkgbuildSeenRef(ctx context.Context, bases []dep.Base) error {
|
|
||||||
var errMulti multierror.MultiError
|
|
||||||
|
|
||||||
for _, base := range bases {
|
|
||||||
pkg := base.Pkgbase()
|
|
||||||
|
|
||||||
if err := gitUpdateSeenRef(ctx, config.BuildDir, pkg); err != nil {
|
|
||||||
errMulti.Add(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return errMulti.Return()
|
|
||||||
}
|
|
||||||
|
|
||||||
func editPkgbuilds(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo) error {
|
|
||||||
pkgbuilds := make([]string, 0, len(bases))
|
|
||||||
|
|
||||||
for _, base := range bases {
|
|
||||||
pkg := base.Pkgbase()
|
|
||||||
dir := filepath.Join(config.BuildDir, pkg)
|
|
||||||
pkgbuilds = append(pkgbuilds, filepath.Join(dir, "PKGBUILD"))
|
|
||||||
|
|
||||||
for _, splitPkg := range srcinfos[pkg].SplitPackages() {
|
|
||||||
if splitPkg.Install != "" {
|
|
||||||
pkgbuilds = append(pkgbuilds, filepath.Join(dir, splitPkg.Install))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(pkgbuilds) > 0 {
|
|
||||||
editor, editorArgs := editor()
|
|
||||||
editorArgs = append(editorArgs, pkgbuilds...)
|
|
||||||
editcmd := exec.Command(editor, editorArgs...)
|
|
||||||
editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
|
||||||
|
|
||||||
if err := editcmd.Run(); err != nil {
|
|
||||||
return errors.New(gotext.Get("editor did not exit successfully, aborting: %s", err))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
@ -748,6 +577,24 @@ func pkgbuildsToSkip(bases []dep.Base, targets stringset.StringSet) stringset.St
|
||||||
return toSkip
|
return toSkip
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func gitMerge(ctx context.Context, path, name string) error {
|
||||||
|
_, stderr, err := config.Runtime.CmdBuilder.Capture(
|
||||||
|
config.Runtime.CmdBuilder.BuildGitCmd(ctx,
|
||||||
|
filepath.Join(path, name), "reset", "--hard", "HEAD"))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf(gotext.Get("error resetting %s: %s", name, stderr))
|
||||||
|
}
|
||||||
|
|
||||||
|
_, stderr, err = config.Runtime.CmdBuilder.Capture(
|
||||||
|
config.Runtime.CmdBuilder.BuildGitCmd(ctx,
|
||||||
|
filepath.Join(path, name), "merge", "--no-edit", "--ff"))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf(gotext.Get("error merging %s: %s", name, stderr))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func mergePkgbuilds(ctx context.Context, bases []dep.Base) error {
|
func mergePkgbuilds(ctx context.Context, bases []dep.Base) error {
|
||||||
for _, base := range bases {
|
for _, base := range bases {
|
||||||
err := gitMerge(ctx, config.BuildDir, base.Pkgbase())
|
err := gitMerge(ctx, config.BuildDir, base.Pkgbase())
|
||||||
|
|
Loading…
Reference in a new issue