Browse Source

refactor(exe): port pacman calls to cmd_builder

jguer 3 years ago
parent
commit
172ee1f4e8
11 changed files with 87 additions and 94 deletions
  1. 5 2
      clean.go
  2. 22 11
      cmd.go
  3. 0 51
      exec.go
  4. 17 9
      install.go
  5. 1 0
      main.go
  6. 2 6
      pkg/settings/args.go
  7. 19 11
      pkg/settings/config.go
  8. 16 0
      pkg/settings/exe/cmd_builder.go
  9. 1 1
      pkg/settings/runtime.go
  10. 2 2
      pkg/vcs/vcs.go
  11. 2 1
      query.go

+ 5 - 2
clean.go

@@ -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
 		}
 	}

+ 22 - 11
cmd.go

@@ -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

+ 0 - 51
exec.go

@@ -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:]...)
-}

+ 17 - 9
install.go

@@ -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
 		}
 

+ 1 - 0
main.go

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

+ 2 - 6
pkg/settings/args.go

@@ -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
 }

+ 19 - 11
pkg/settings/config.go

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

+ 16 - 0
pkg/settings/exe/cmd_builder.go

@@ -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)

+ 1 - 1
pkg/settings/runtime.go

@@ -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

+ 2 - 2
pkg/vcs/vcs.go

@@ -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,

+ 2 - 1
query.go

@@ -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