refactor(exe): port pacman calls to cmd_builder

This commit is contained in:
jguer 2021-08-08 00:57:55 +02:00 committed by J Guerreiro
parent 1a2e5b9529
commit 172ee1f4e8
11 changed files with 87 additions and 94 deletions

View file

@ -37,7 +37,9 @@ func cleanRemove(cmdArgs *parser.Arguments, pkgNames []string) error {
_ = arguments.AddArg("R")
arguments.AddTarget(pkgNames...)
return config.Runtime.CmdRunner.Show(passToPacman(arguments))
return config.Runtime.CmdRunner.Show(
config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm))
}
func syncClean(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
@ -55,7 +57,8 @@ func syncClean(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
}
if config.Runtime.Mode == parser.ModeRepo || config.Runtime.Mode == parser.ModeAny {
if err := config.Runtime.CmdRunner.Show(passToPacman(cmdArgs)); err != nil {
if err := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm)); err != nil {
return err
}
}

33
cmd.go
View file

@ -158,9 +158,11 @@ func handleCmd(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
handleVersion()
return nil
case "D", "database":
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "F", "files":
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "Q", "query":
return handleQuery(cmdArgs, dbExecutor)
case "R", "remove":
@ -168,9 +170,11 @@ func handleCmd(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
case "S", "sync":
return handleSync(cmdArgs, dbExecutor)
case "T", "deptest":
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "U", "upgrade":
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "G", "getpkgbuild":
return handleGetpkgbuild(cmdArgs, dbExecutor)
case "P", "show":
@ -212,7 +216,8 @@ func handleQuery(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
}
return printUpdateList(cmdArgs, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"), filter)
}
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
func handleHelp(cmdArgs *parser.Arguments) error {
@ -220,7 +225,8 @@ func handleHelp(cmdArgs *parser.Arguments) error {
usage()
return nil
}
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
func handleVersion() {
@ -298,7 +304,8 @@ func handleSync(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
return syncSearch(targets, config.Runtime.AURClient, dbExecutor)
}
if cmdArgs.ExistsArg("p", "print", "print-format") {
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
if cmdArgs.ExistsArg("c", "clean") {
return syncClean(cmdArgs, dbExecutor)
@ -307,7 +314,8 @@ func handleSync(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
return syncList(config.Runtime.HTTPClient, cmdArgs, dbExecutor)
}
if cmdArgs.ExistsArg("g", "groups") {
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
if cmdArgs.ExistsArg("i", "info") {
return syncInfo(cmdArgs, targets, dbExecutor)
@ -319,13 +327,15 @@ func handleSync(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
return install(cmdArgs, dbExecutor, false)
}
if cmdArgs.ExistsArg("y", "refresh") {
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
return nil
}
func handleRemove(cmdArgs *parser.Arguments, localCache *vcs.InfoStore) error {
err := config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
err := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
if err == nil {
localCache.RemovePackage(cmdArgs.Targets)
}
@ -489,7 +499,8 @@ func syncList(httpClient *http.Client, cmdArgs *parser.Arguments, dbExecutor db.
}
if (config.Runtime.Mode == parser.ModeAny || config.Runtime.Mode == parser.ModeRepo) && (len(cmdArgs.Targets) != 0 || !aur) {
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
return nil

51
exec.go
View file

@ -4,15 +4,7 @@ import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
"github.com/leonelquinteros/gotext"
"github.com/Jguer/yay/v10/pkg/settings"
"github.com/Jguer/yay/v10/pkg/settings/parser"
"github.com/Jguer/yay/v10/pkg/text"
)
func sudoLoopBackground() {
@ -37,46 +29,3 @@ func updateSudo() {
}
}
}
// waitLock will lock yay checking the status of db.lck until it does not exist
func waitLock(dbPath string) {
lockDBPath := filepath.Join(dbPath, "db.lck")
if _, err := os.Stat(lockDBPath); err != nil {
return
}
text.Warnln(gotext.Get("%s is present.", lockDBPath))
text.Warn(gotext.Get("There may be another Pacman instance running. Waiting..."))
for {
time.Sleep(3 * time.Second)
if _, err := os.Stat(lockDBPath); err != nil {
fmt.Println()
return
}
}
}
func passToPacman(args *parser.Arguments) *exec.Cmd {
argArr := make([]string, 0, 32)
if args.NeedRoot(config.Runtime.Mode) {
argArr = append(argArr, config.SudoBin)
argArr = append(argArr, strings.Fields(config.SudoFlags)...)
}
argArr = append(argArr, config.PacmanBin)
argArr = append(argArr, args.FormatGlobals()...)
argArr = append(argArr, args.FormatArgs()...)
if settings.NoConfirm {
argArr = append(argArr, "--noconfirm")
}
argArr = append(argArr, "--config", config.PacmanConf, "--")
argArr = append(argArr, args.Targets...)
if args.NeedRoot(config.Runtime.Mode) {
waitLock(config.Runtime.PacmanConf.DBPath)
}
return exec.Command(argArr[0], argArr[1:]...)
}

View file

@ -38,7 +38,8 @@ func asdeps(cmdArgs *parser.Arguments, pkgs []string) (err error) {
cmdArgs = cmdArgs.CopyGlobal()
_ = cmdArgs.AddArg("q", "D", "asdeps")
cmdArgs.AddTarget(pkgs...)
err = config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
err = config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
if err != nil {
return fmt.Errorf(gotext.Get("error updating package install reason to dependency"))
}
@ -54,7 +55,8 @@ func asexp(cmdArgs *parser.Arguments, pkgs []string) (err error) {
cmdArgs = cmdArgs.CopyGlobal()
_ = cmdArgs.AddArg("q", "D", "asexplicit")
cmdArgs.AddTarget(pkgs...)
err = config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
err = config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
if err != nil {
return fmt.Errorf(gotext.Get("error updating package install reason to explicit"))
}
@ -77,7 +79,7 @@ func install(cmdArgs *parser.Arguments, dbExecutor db.Executor, ignoreProviders
)
if noDeps {
config.Runtime.CmdBuilder.MakepkgFlags = append(config.Runtime.CmdBuilder.MakepkgFlags, "-d")
config.Runtime.CmdBuilder.AddMakepkgFlag("-d")
}
if config.Runtime.Mode == parser.ModeAny || config.Runtime.Mode == parser.ModeRepo {
@ -168,7 +170,8 @@ func install(cmdArgs *parser.Arguments, dbExecutor db.Executor, ignoreProviders
if arguments.ExistsArg("ignore") {
cmdArgs.CreateOrAppendOption("ignore", arguments.GetArgs("ignore")...)
}
return config.Runtime.CmdRunner.Show(passToPacman(cmdArgs))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
if len(dp.Aur) > 0 && os.Geteuid() == 0 {
@ -341,7 +344,8 @@ func install(cmdArgs *parser.Arguments, dbExecutor db.Executor, ignoreProviders
}
if len(arguments.Targets) > 0 || arguments.ExistsArg("u") {
if errShow := config.Runtime.CmdRunner.Show(passToPacman(arguments)); errShow != nil {
if errShow := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm)); errShow != nil {
return errors.New(gotext.Get("error installing repo packages"))
}
@ -400,7 +404,8 @@ func removeMake(do *dep.Order) error {
oldValue := settings.NoConfirm
settings.NoConfirm = true
err = config.Runtime.CmdRunner.Show(passToPacman(removeArguments))
err = config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
removeArguments, config.Runtime.Mode, settings.NoConfirm))
settings.NoConfirm = oldValue
return err
@ -444,7 +449,8 @@ func earlyPacmanCall(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
}
if cmdArgs.ExistsArg("y", "refresh") || cmdArgs.ExistsArg("u", "sysupgrade") || len(arguments.Targets) > 0 {
if err := config.Runtime.CmdRunner.Show(passToPacman(arguments)); err != nil {
if err := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm)); err != nil {
return errors.New(gotext.Get("error installing repo packages"))
}
}
@ -460,7 +466,8 @@ func earlyRefresh(cmdArgs *parser.Arguments) error {
arguments.DelArg("i", "info")
arguments.DelArg("l", "list")
arguments.ClearTargets()
return config.Runtime.CmdRunner.Show(passToPacman(arguments))
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm))
}
func alpmArchIsSupported(alpmArch []string, arch string) bool {
@ -898,7 +905,8 @@ func buildInstallPkgbuilds(
return nil
}
if errShow := config.Runtime.CmdRunner.Show(passToPacman(arguments)); errShow != nil {
if errShow := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm)); errShow != nil {
return errShow
}

View file

@ -124,6 +124,7 @@ func main() {
ret = 1
return
}
config.Runtime.CmdBuilder.SetPacmanDBPath(config.Runtime.PacmanConf.DBPath)
text.UseColor = useColor

View file

@ -14,12 +14,8 @@ func (c *Configuration) ParseCommandLine(a *parser.Arguments) error {
c.extractYayOptions(a)
cmdBuilder := c.Runtime.CmdBuilder
cmdBuilder.GitBin = c.GitBin
cmdBuilder.GitFlags = strings.Fields(c.GitFlags)
cmdBuilder.MakepkgFlags = strings.Fields(c.MFlags)
cmdBuilder.MakepkgConfPath = c.MakepkgConf
cmdBuilder.MakepkgBin = c.MakepkgBin
// Reload CmdBuilder
c.Runtime.CmdBuilder = c.CmdBuilder()
return nil
}

View file

@ -209,17 +209,11 @@ func NewConfig(version string) (*Configuration, error) {
SaveConfig: false,
CompletionPath: filepath.Join(cacheHome, completionFileName),
CmdRunner: &exe.OSRunner{},
CmdBuilder: &exe.CmdBuilder{
GitBin: newConfig.GitBin,
GitFlags: strings.Fields(newConfig.GitFlags),
MakepkgFlags: strings.Fields(newConfig.MFlags),
MakepkgConfPath: newConfig.MakepkgConf,
MakepkgBin: newConfig.MakepkgBin,
},
PacmanConf: nil,
VCSStore: nil,
HTTPClient: &http.Client{},
AURClient: nil,
CmdBuilder: newConfig.CmdBuilder(),
PacmanConf: nil,
VCSStore: nil,
HTTPClient: &http.Client{},
AURClient: nil,
}
var errAUR error
@ -264,3 +258,17 @@ func (c *Configuration) load(configPath string) {
}
}
}
func (c *Configuration) CmdBuilder() exe.ICmdBuilder {
return &exe.CmdBuilder{
GitBin: c.GitBin,
GitFlags: strings.Fields(c.GitFlags),
MakepkgFlags: strings.Fields(c.MFlags),
MakepkgConfPath: c.MakepkgConf,
MakepkgBin: c.MakepkgBin,
SudoBin: c.SudoBin,
SudoFlags: strings.Fields(c.SudoFlags),
PacmanBin: c.PacmanBin,
PacmanConfigPath: c.PacmanConf,
}
}

View file

@ -17,6 +17,14 @@ type GitCmdBuilder interface {
BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd
}
type ICmdBuilder interface {
BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd
BuildMakepkgCmd(dir string, extraArgs ...string) *exec.Cmd
BuildPacmanCmd(args *parser.Arguments, mode parser.TargetMode, noConfirm bool) *exec.Cmd
AddMakepkgFlag(string)
SetPacmanDBPath(string)
}
type CmdBuilder struct {
GitBin string
GitFlags []string
@ -47,6 +55,10 @@ func (c *CmdBuilder) BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd {
return cmd
}
func (c *CmdBuilder) AddMakepkgFlag(flag string) {
c.MakepkgFlags = append(c.MakepkgFlags, flag)
}
func (c *CmdBuilder) BuildMakepkgCmd(dir string, extraArgs ...string) *exec.Cmd {
args := make([]string, len(c.MakepkgFlags), len(c.MakepkgFlags)+len(extraArgs))
copy(args, c.MakepkgFlags)
@ -64,6 +76,10 @@ func (c *CmdBuilder) BuildMakepkgCmd(dir string, extraArgs ...string) *exec.Cmd
return cmd
}
func (c *CmdBuilder) SetPacmanDBPath(dbPath string) {
c.PacmanDBPath = dbPath
}
func (c *CmdBuilder) BuildPacmanCmd(args *parser.Arguments, mode parser.TargetMode, noConfirm bool) *exec.Cmd {
argArr := make([]string, 0, 32)
needsRoot := args.NeedRoot(mode)

View file

@ -19,7 +19,7 @@ type Runtime struct {
ConfigPath string
PacmanConf *pacmanconf.Config
VCSStore *vcs.InfoStore
CmdBuilder *exe.CmdBuilder
CmdBuilder exe.ICmdBuilder
CmdRunner exe.Runner
HTTPClient *http.Client
AURClient *aur.Client

View file

@ -21,7 +21,7 @@ type InfoStore struct {
OriginsByPackage map[string]OriginInfoByURL
FilePath string
Runner exe.Runner
CmdBuilder *exe.CmdBuilder
CmdBuilder exe.ICmdBuilder
}
// OriginInfoByURL stores the OriginInfo of each origin URL provided
@ -42,7 +42,7 @@ type OriginInfo struct {
SHA string `json:"sha"`
}
func NewInfoStore(filePath string, runner exe.Runner, cmdBuilder *exe.CmdBuilder) *InfoStore {
func NewInfoStore(filePath string, runner exe.Runner, cmdBuilder exe.ICmdBuilder) *InfoStore {
infoStore := &InfoStore{
CmdBuilder: cmdBuilder,
FilePath: filePath,

View file

@ -217,7 +217,8 @@ func syncInfo(cmdArgs *parser.Arguments, pkgS []string, dbExecutor db.Executor)
arguments := cmdArgs.Copy()
arguments.ClearTargets()
arguments.AddTarget(repoS...)
err = config.Runtime.CmdRunner.Show(passToPacman(arguments))
err = config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
if err != nil {
return err