1
0
mirror of https://github.com/Jguer/yay synced 2024-07-03 08:51:44 +00:00

refactor(exe): move sudo loop into CmdBuilder

This commit is contained in:
jguer 2021-08-08 20:22:39 +02:00 committed by J Guerreiro
parent 444151de0d
commit 5c11c01d85
21 changed files with 146 additions and 143 deletions

View File

@ -37,7 +37,7 @@ func cleanRemove(cmdArgs *parser.Arguments, pkgNames []string) error {
_ = arguments.AddArg("R")
arguments.AddTarget(pkgNames...)
return config.Runtime.CmdRunner.Show(
return config.Runtime.CmdBuilder.Show(
config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm))
}
@ -57,7 +57,7 @@ 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(config.Runtime.CmdBuilder.BuildPacmanCmd(
if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm)); err != nil {
return err
}
@ -177,7 +177,7 @@ func cleanUntracked() error {
dir := filepath.Join(config.BuildDir, file.Name())
if isGitRepository(dir) {
if err := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, "clean", "-fx")); err != nil {
if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, "clean", "-fx")); err != nil {
text.Warnln(gotext.Get("Unable to clean:"), dir)
return err
}
@ -202,12 +202,12 @@ func cleanAfter(bases []dep.Base) {
text.OperationInfoln(gotext.Get("Cleaning (%d/%d): %s", i+1, len(bases), text.Cyan(dir)))
_, stderr, err := config.Runtime.CmdRunner.Capture(config.Runtime.CmdBuilder.BuildGitCmd(dir, "reset", "--hard", "HEAD"), 0)
_, stderr, err := config.Runtime.CmdBuilder.Capture(config.Runtime.CmdBuilder.BuildGitCmd(dir, "reset", "--hard", "HEAD"), 0)
if err != nil {
text.Errorln(gotext.Get("error resetting %s: %s", base.String(), stderr))
}
if err := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, "clean", "-fx", "--exclude='*.pkg.*'")); err != nil {
if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, "clean", "-fx", "--exclude='*.pkg.*'")); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}

28
cmd.go
View File

@ -150,7 +150,7 @@ func handleCmd(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
}
if config.SudoLoop && cmdArgs.NeedRoot(config.Runtime.Mode) {
sudoLoopBackground()
config.Runtime.CmdBuilder.SudoLoop()
}
switch cmdArgs.Op {
@ -158,10 +158,10 @@ func handleCmd(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
handleVersion()
return nil
case "D", "database":
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "F", "files":
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "Q", "query":
return handleQuery(cmdArgs, dbExecutor)
@ -170,10 +170,10 @@ func handleCmd(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
case "S", "sync":
return handleSync(cmdArgs, dbExecutor)
case "T", "deptest":
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "U", "upgrade":
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
case "G", "getpkgbuild":
return handleGetpkgbuild(cmdArgs, dbExecutor)
@ -216,7 +216,7 @@ func handleQuery(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
}
return printUpdateList(cmdArgs, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade"), filter)
}
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
@ -225,7 +225,7 @@ func handleHelp(cmdArgs *parser.Arguments) error {
usage()
return nil
}
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
@ -304,7 +304,7 @@ 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(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
if cmdArgs.ExistsArg("c", "clean") {
@ -314,7 +314,7 @@ 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(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
if cmdArgs.ExistsArg("i", "info") {
@ -327,14 +327,14 @@ func handleSync(cmdArgs *parser.Arguments, dbExecutor db.Executor) error {
return install(cmdArgs, dbExecutor, false)
}
if cmdArgs.ExistsArg("y", "refresh") {
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.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(config.Runtime.CmdBuilder.BuildPacmanCmd(
err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
if err == nil {
localCache.RemovePackage(cmdArgs.Targets)
@ -450,10 +450,6 @@ func displayNumberMenu(pkgS []string, dbExecutor db.Executor, cmdArgs *parser.Ar
return nil
}
if config.SudoLoop {
sudoLoopBackground()
}
return install(arguments, dbExecutor, true)
}
@ -499,7 +495,7 @@ 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(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}

14
diff.go
View File

@ -50,7 +50,7 @@ func showPkgbuildDiffs(bases []dep.Base, cloned map[string]bool) error {
} else {
args = append(args, "--color=never")
}
_ = config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, args...))
_ = config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, args...))
}
return errMulti.Return()
@ -60,7 +60,7 @@ func showPkgbuildDiffs(bases []dep.Base, cloned map[string]bool) error {
// HEAD@{upstream}
func gitHasDiff(path, name string) (bool, error) {
if gitHasLastSeenRef(path, name) {
stdout, stderr, err := config.Runtime.CmdRunner.Capture(
stdout, stderr, err := config.Runtime.CmdBuilder.Capture(
config.Runtime.CmdBuilder.BuildGitCmd(filepath.Join(path, name), "rev-parse", gitDiffRefName, "HEAD@{upstream}"), 0)
if err != nil {
return false, fmt.Errorf("%s%s", stderr, err)
@ -79,7 +79,7 @@ func gitHasDiff(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(path, name string) bool {
_, _, err := config.Runtime.CmdRunner.Capture(
_, _, err := config.Runtime.CmdBuilder.Capture(
config.Runtime.CmdBuilder.BuildGitCmd(
filepath.Join(path, name), "rev-parse", "--quiet", "--verify", gitDiffRefName), 0)
return err == nil
@ -89,7 +89,7 @@ func gitHasLastSeenRef(path, name string) bool {
// If it does not it will return empty tree as no diff have been reviewed yet.
func getLastSeenHash(path, name string) (string, error) {
if gitHasLastSeenRef(path, name) {
stdout, stderr, err := config.Runtime.CmdRunner.Capture(
stdout, stderr, err := config.Runtime.CmdBuilder.Capture(
config.Runtime.CmdBuilder.BuildGitCmd(
filepath.Join(path, name), "rev-parse", gitDiffRefName), 0)
if err != nil {
@ -105,7 +105,7 @@ func getLastSeenHash(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(path, name string) error {
_, stderr, err := config.Runtime.CmdRunner.Capture(
_, stderr, err := config.Runtime.CmdBuilder.Capture(
config.Runtime.CmdBuilder.BuildGitCmd(
filepath.Join(path, name), "update-ref", gitDiffRefName, "HEAD"), 0)
if err != nil {
@ -115,14 +115,14 @@ func gitUpdateSeenRef(path, name string) error {
}
func gitMerge(path, name string) error {
_, stderr, err := config.Runtime.CmdRunner.Capture(
_, stderr, err := config.Runtime.CmdBuilder.Capture(
config.Runtime.CmdBuilder.BuildGitCmd(
filepath.Join(path, name), "reset", "--hard", "HEAD"), 0)
if err != nil {
return fmt.Errorf(gotext.Get("error resetting %s: %s", name, stderr))
}
_, stderr, err = config.Runtime.CmdRunner.Capture(
_, stderr, err = config.Runtime.CmdBuilder.Capture(
config.Runtime.CmdBuilder.BuildGitCmd(
filepath.Join(path, name), "merge", "--no-edit", "--ff"), 0)
if err != nil {

31
exec.go
View File

@ -1,31 +0,0 @@
package main
import (
"fmt"
"os"
"os/exec"
"time"
)
func sudoLoopBackground() {
updateSudo()
go sudoLoop()
}
func sudoLoop() {
for {
updateSudo()
time.Sleep(241 * time.Second)
}
}
func updateSudo() {
for {
err := config.Runtime.CmdRunner.Show(exec.Command(config.SudoBin, "-v"))
if err != nil {
fmt.Fprintln(os.Stderr, err)
} else {
break
}
}
}

2
get.go
View File

@ -50,7 +50,7 @@ func getPkgbuilds(dbExecutor db.Executor, config *settings.Configuration, target
if err != nil {
return err
}
cloned, errD := download.PKGBUILDRepos(dbExecutor, config.Runtime.CmdRunner,
cloned, errD := download.PKGBUILDRepos(dbExecutor,
config.Runtime.CmdBuilder, targets, config.Runtime.Mode, config.AURURL, wd, force)
if errD != nil {
text.Errorln(errD)

View File

@ -38,7 +38,7 @@ 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(config.Runtime.CmdBuilder.BuildPacmanCmd(
err = config.Runtime.CmdBuilder.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"))
@ -55,7 +55,7 @@ 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(config.Runtime.CmdBuilder.BuildPacmanCmd(
err = config.Runtime.CmdBuilder.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"))
@ -170,7 +170,7 @@ func install(cmdArgs *parser.Arguments, dbExecutor db.Executor, ignoreProviders
if arguments.ExistsArg("ignore") {
cmdArgs.CreateOrAppendOption("ignore", arguments.GetArgs("ignore")...)
}
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
cmdArgs, config.Runtime.Mode, settings.NoConfirm))
}
@ -253,7 +253,7 @@ func install(cmdArgs *parser.Arguments, dbExecutor db.Executor, ignoreProviders
len(toSkipSlice), len(toClone), text.Cyan(strings.Join(toSkipSlice, ", "))))
}
cloned, errA := download.AURPKGBUILDRepos(config.Runtime.CmdRunner,
cloned, errA := download.AURPKGBUILDRepos(
config.Runtime.CmdBuilder, toClone, config.AURURL, config.BuildDir, false)
if errA != nil {
return err
@ -344,7 +344,7 @@ func install(cmdArgs *parser.Arguments, dbExecutor db.Executor, ignoreProviders
}
if len(arguments.Targets) > 0 || arguments.ExistsArg("u") {
if errShow := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
if errShow := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm)); errShow != nil {
return errors.New(gotext.Get("error installing repo packages"))
}
@ -404,7 +404,7 @@ func removeMake(do *dep.Order) error {
oldValue := settings.NoConfirm
settings.NoConfirm = true
err = config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
err = config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
removeArguments, config.Runtime.Mode, settings.NoConfirm))
settings.NoConfirm = oldValue
@ -449,7 +449,7 @@ 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(config.Runtime.CmdBuilder.BuildPacmanCmd(
if err := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm)); err != nil {
return errors.New(gotext.Get("error installing repo packages"))
}
@ -466,7 +466,7 @@ func earlyRefresh(cmdArgs *parser.Arguments) error {
arguments.DelArg("i", "info")
arguments.DelArg("l", "list")
arguments.ClearTargets()
return config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
return config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm))
}
@ -521,7 +521,7 @@ nextpkg:
}
func parsePackageList(dir string) (pkgdests map[string]string, pkgVersion string, err error) {
stdout, stderr, err := config.Runtime.CmdRunner.Capture(
stdout, stderr, err := config.Runtime.CmdBuilder.Capture(
config.Runtime.CmdBuilder.BuildMakepkgCmd(dir, "--packagelist"), 0)
if err != nil {
return nil, "", fmt.Errorf("%s %s", stderr, err)
@ -853,7 +853,7 @@ func downloadPkgbuildsSources(bases []dep.Base, incompatible stringset.StringSet
args = append(args, "--ignorearch")
}
err = config.Runtime.CmdRunner.Show(
err = config.Runtime.CmdBuilder.Show(
config.Runtime.CmdBuilder.BuildMakepkgCmd(dir, args...))
if err != nil {
return errors.New(gotext.Get("error downloading sources: %s", text.Cyan(base.String())))
@ -905,7 +905,7 @@ func buildInstallPkgbuilds(
return nil
}
if errShow := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
if errShow := config.Runtime.CmdBuilder.Show(config.Runtime.CmdBuilder.BuildPacmanCmd(
arguments, config.Runtime.Mode, settings.NoConfirm)); errShow != nil {
return errShow
}
@ -965,7 +965,7 @@ func buildInstallPkgbuilds(
}
// pkgver bump
if err = config.Runtime.CmdRunner.Show(
if err = config.Runtime.CmdBuilder.Show(
config.Runtime.CmdBuilder.BuildMakepkgCmd(dir, args...)); err != nil {
return errors.New(gotext.Get("error making: %s", base.String()))
}
@ -1003,7 +1003,7 @@ func buildInstallPkgbuilds(
}
if installed {
err = config.Runtime.CmdRunner.Show(
err = config.Runtime.CmdBuilder.Show(
config.Runtime.CmdBuilder.BuildMakepkgCmd(
dir, "-c", "--nobuild", "--noextract", "--ignorearch"))
if err != nil {
@ -1016,7 +1016,7 @@ func buildInstallPkgbuilds(
}
if built {
err = config.Runtime.CmdRunner.Show(
err = config.Runtime.CmdBuilder.Show(
config.Runtime.CmdBuilder.BuildMakepkgCmd(
dir, "-c", "--nobuild", "--noextract", "--ignorearch"))
if err != nil {
@ -1031,7 +1031,7 @@ func buildInstallPkgbuilds(
args = append(args, "--ignorearch")
}
if errMake := config.Runtime.CmdRunner.Show(
if errMake := config.Runtime.CmdBuilder.Show(
config.Runtime.CmdBuilder.BuildMakepkgCmd(
dir, args...)); errMake != nil {
return errors.New(gotext.Get("error making: %s", base.String()))

View File

@ -83,12 +83,12 @@ func ABSPKGBUILD(httpClient *http.Client, dbName, pkgName string) ([]byte, error
}
// ABSPKGBUILDRepo retrieves the PKGBUILD repository to a dest directory.
func ABSPKGBUILDRepo(cmdRunner exe.Runner, cmdBuilder exe.GitCmdBuilder, dbName, pkgName, dest string, force bool) (bool, error) {
func ABSPKGBUILDRepo(cmdBuilder exe.GitCmdBuilder, dbName, pkgName, dest string, force bool) (bool, error) {
pkgURL, err := getPackageRepoURL(dbName)
if err != nil {
return false, err
}
return downloadGitRepo(cmdRunner, cmdBuilder, pkgURL,
return downloadGitRepo(cmdBuilder, pkgURL,
pkgName, dest, force, "--single-branch", "-b", "packages/"+pkgName)
}

View File

@ -197,11 +197,12 @@ func TestABSPKGBUILDRepo(t *testing.T) {
test: t,
want: "/usr/local/bin/git --no-replace-objects -C /tmp/doesnt-exist clone --no-progress --single-branch -b packages/linux https://github.com/archlinux/svntogit-packages.git linux",
parentBuilder: &exe.CmdBuilder{
Runner: cmdRunner,
GitBin: "/usr/local/bin/git",
GitFlags: []string{"--no-replace-objects"},
},
}
newClone, err := ABSPKGBUILDRepo(cmdRunner, cmdBuilder, "core", "linux", "/tmp/doesnt-exist", false)
newClone, err := ABSPKGBUILDRepo(cmdBuilder, "core", "linux", "/tmp/doesnt-exist", false)
assert.NoError(t, err)
assert.Equal(t, true, newClone)
}
@ -221,11 +222,12 @@ func TestABSPKGBUILDRepoExistsPerms(t *testing.T) {
test: t,
want: fmt.Sprintf("/usr/local/bin/git --no-replace-objects -C %s/linux pull --ff-only", dir),
parentBuilder: &exe.CmdBuilder{
Runner: cmdRunner,
GitBin: "/usr/local/bin/git",
GitFlags: []string{"--no-replace-objects"},
},
}
newClone, err := ABSPKGBUILDRepo(cmdRunner, cmdBuilder, "core", "linux", dir, false)
newClone, err := ABSPKGBUILDRepo(cmdBuilder, "core", "linux", dir, false)
assert.NoError(t, err)
assert.Equal(t, false, newClone)
}

View File

@ -41,14 +41,13 @@ func AURPKGBUILD(httpClient *http.Client, pkgName string) ([]byte, error) {
}
// AURPkgbuildRepo retrieves the PKGBUILD repository to a dest directory.
func AURPKGBUILDRepo(cmdRunner exe.Runner, cmdBuilder exe.GitCmdBuilder, aurURL, pkgName, dest string, force bool) (bool, error) {
func AURPKGBUILDRepo(cmdBuilder exe.GitCmdBuilder, aurURL, pkgName, dest string, force bool) (bool, error) {
pkgURL := fmt.Sprintf("%s/%s.git", aurURL, pkgName)
return downloadGitRepo(cmdRunner, cmdBuilder, pkgURL, pkgName, dest, force)
return downloadGitRepo(cmdBuilder, pkgURL, pkgName, dest, force)
}
func AURPKGBUILDRepos(
cmdRunner exe.Runner,
cmdBuilder exe.GitCmdBuilder,
targets []string, aurURL, dest string, force bool) (map[string]bool, error) {
cloned := make(map[string]bool, len(targets))
@ -67,7 +66,7 @@ func AURPKGBUILDRepos(
wg.Add(1)
go func(target string) {
newClone, err := AURPKGBUILDRepo(cmdRunner, cmdBuilder, aurURL, target, dest, force)
newClone, err := AURPKGBUILDRepo(cmdBuilder, aurURL, target, dest, force)
if err != nil {
errs.Add(err)

View File

@ -80,11 +80,12 @@ func TestAURPKGBUILDRepo(t *testing.T) {
test: t,
want: "/usr/local/bin/git --no-replace-objects -C /tmp/doesnt-exist clone --no-progress https://aur.archlinux.org/yay-bin.git yay-bin",
parentBuilder: &exe.CmdBuilder{
Runner: cmdRunner,
GitBin: "/usr/local/bin/git",
GitFlags: []string{"--no-replace-objects"},
},
}
newCloned, err := AURPKGBUILDRepo(cmdRunner, cmdBuilder, "https://aur.archlinux.org", "yay-bin", "/tmp/doesnt-exist", false)
newCloned, err := AURPKGBUILDRepo(cmdBuilder, "https://aur.archlinux.org", "yay-bin", "/tmp/doesnt-exist", false)
assert.NoError(t, err)
assert.Equal(t, true, newCloned)
}
@ -104,11 +105,12 @@ func TestAURPKGBUILDRepoExistsPerms(t *testing.T) {
test: t,
want: fmt.Sprintf("/usr/local/bin/git --no-replace-objects -C %s/yay-bin pull --ff-only", dir),
parentBuilder: &exe.CmdBuilder{
Runner: cmdRunner,
GitBin: "/usr/local/bin/git",
GitFlags: []string{"--no-replace-objects"},
},
}
cloned, err := AURPKGBUILDRepo(cmdRunner, cmdBuilder, "https://aur.archlinux.org", "yay-bin", dir, false)
cloned, err := AURPKGBUILDRepo(cmdBuilder, "https://aur.archlinux.org", "yay-bin", dir, false)
assert.NoError(t, err)
assert.Equal(t, false, cloned)
}

View File

@ -22,8 +22,8 @@ type DBSearcher interface {
SatisfierFromDB(string, string) db.IPackage
}
func downloadGitRepo(cmdRunner exe.Runner,
cmdBuilder exe.GitCmdBuilder, pkgURL, pkgName, dest string, force bool, gitArgs ...string) (bool, error) {
func downloadGitRepo(cmdBuilder exe.GitCmdBuilder,
pkgURL, pkgName, dest string, force bool, gitArgs ...string) (bool, error) {
finalDir := filepath.Join(dest, pkgName)
newClone := true
@ -41,7 +41,7 @@ func downloadGitRepo(cmdRunner exe.Runner,
cloneArgs = append(cloneArgs, gitArgs...)
cmd := cmdBuilder.BuildGitCmd(dest, cloneArgs...)
_, stderr, errCapture := cmdRunner.Capture(cmd, 0)
_, stderr, errCapture := cmdBuilder.Capture(cmd, 0)
if errCapture != nil {
return false, ErrGetPKGBUILDRepo{inner: errCapture, pkgName: pkgName, errOut: stderr}
}
@ -54,7 +54,7 @@ func downloadGitRepo(cmdRunner exe.Runner,
} else {
cmd := cmdBuilder.BuildGitCmd(filepath.Join(dest, pkgName), "pull", "--ff-only")
_, stderr, errCmd := cmdRunner.Capture(cmd, 0)
_, stderr, errCmd := cmdBuilder.Capture(cmd, 0)
if errCmd != nil {
return false, ErrGetPKGBUILDRepo{inner: errCmd, pkgName: pkgName, errOut: stderr}
}
@ -126,7 +126,6 @@ func PKGBUILDs(dbExecutor DBSearcher, httpClient *http.Client, targets []string,
}
func PKGBUILDRepos(dbExecutor DBSearcher,
cmdRunner exe.Runner,
cmdBuilder exe.GitCmdBuilder,
targets []string, mode parser.TargetMode, aurURL, dest string, force bool) (map[string]bool, error) {
cloned := make(map[string]bool, len(targets))
@ -155,9 +154,9 @@ func PKGBUILDRepos(dbExecutor DBSearcher,
var newClone bool
if aur {
newClone, err = AURPKGBUILDRepo(cmdRunner, cmdBuilder, aurURL, pkgName, dest, force)
newClone, err = AURPKGBUILDRepo(cmdBuilder, aurURL, pkgName, dest, force)
} else {
newClone, err = ABSPKGBUILDRepo(cmdRunner, cmdBuilder, dbName, pkgName, dest, force)
newClone, err = ABSPKGBUILDRepo(cmdBuilder, dbName, pkgName, dest, force)
}
if err != nil {

View File

@ -9,8 +9,7 @@ import (
"github.com/Jguer/yay/v10/pkg/settings/exe"
)
type testRunner struct {
}
type testRunner struct{}
func (t *testRunner) Capture(cmd *exec.Cmd, timeout int64) (stdout string, stderr string, err error) {
return "", "", nil
@ -35,3 +34,11 @@ func (t *testGitBuilder) BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd
t.index += 1
return cmd
}
func (c *testGitBuilder) Show(cmd *exec.Cmd) error {
return c.parentBuilder.Show(cmd)
}
func (c *testGitBuilder) Capture(cmd *exec.Cmd, timeout int64) (stdout, stderr string, err error) {
return c.parentBuilder.Capture(cmd, timeout)
}

View File

@ -15,7 +15,7 @@ func (c *Configuration) ParseCommandLine(a *parser.Arguments) error {
c.extractYayOptions(a)
// Reload CmdBuilder
c.Runtime.CmdBuilder = c.CmdBuilder()
c.Runtime.CmdBuilder = c.CmdBuilder(nil)
return nil
}

View File

@ -208,8 +208,7 @@ func NewConfig(version string) (*Configuration, error) {
Mode: parser.ModeAny,
SaveConfig: false,
CompletionPath: filepath.Join(cacheHome, completionFileName),
CmdRunner: &exe.OSRunner{},
CmdBuilder: newConfig.CmdBuilder(),
CmdBuilder: newConfig.CmdBuilder(nil),
PacmanConf: nil,
VCSStore: nil,
HTTPClient: &http.Client{},
@ -229,8 +228,8 @@ func NewConfig(version string) (*Configuration, error) {
return nil, errAUR
}
newConfig.Runtime.VCSStore = vcs.NewInfoStore(filepath.Join(cacheHome, vcsFileName),
newConfig.Runtime.CmdRunner, newConfig.Runtime.CmdBuilder)
newConfig.Runtime.VCSStore = vcs.NewInfoStore(
filepath.Join(cacheHome, vcsFileName), newConfig.Runtime.CmdBuilder)
if err := initDir(newConfig.BuildDir); err != nil {
return nil, err
@ -259,7 +258,10 @@ func (c *Configuration) load(configPath string) {
}
}
func (c *Configuration) CmdBuilder() exe.ICmdBuilder {
func (c *Configuration) CmdBuilder(runner exe.Runner) exe.ICmdBuilder {
if runner == nil {
runner = &exe.OSRunner{}
}
return &exe.CmdBuilder{
GitBin: c.GitBin,
GitFlags: strings.Fields(c.GitFlags),
@ -268,7 +270,10 @@ func (c *Configuration) CmdBuilder() exe.ICmdBuilder {
MakepkgBin: c.MakepkgBin,
SudoBin: c.SudoBin,
SudoFlags: strings.Fields(c.SudoFlags),
SudoLoopEnabled: false,
PacmanBin: c.PacmanBin,
PacmanConfigPath: c.PacmanConf,
PacmanDBPath: "",
Runner: runner,
}
}

View File

@ -13,16 +13,21 @@ import (
"github.com/Jguer/yay/v10/pkg/text"
)
const SudoLoopDuration = 241
type GitCmdBuilder interface {
Runner
BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd
}
type ICmdBuilder interface {
Runner
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)
SudoLoop()
}
type CmdBuilder struct {
@ -33,9 +38,11 @@ type CmdBuilder struct {
MakepkgBin string
SudoBin string
SudoFlags []string
SudoLoopEnabled bool
PacmanBin string
PacmanConfigPath string
PacmanDBPath string
Runner Runner
}
func (c *CmdBuilder) BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd {
@ -123,3 +130,34 @@ func waitLock(dbPath string) {
}
}
}
func (c *CmdBuilder) SudoLoop() {
c.updateSudo()
go c.sudoLoopBackground()
}
func (c *CmdBuilder) sudoLoopBackground() {
for {
c.updateSudo()
time.Sleep(SudoLoopDuration * time.Second)
}
}
func (c *CmdBuilder) updateSudo() {
for {
err := c.Show(exec.Command(c.SudoBin, "-v"))
if err != nil {
fmt.Fprintln(os.Stderr, err)
} else {
break
}
}
}
func (c *CmdBuilder) Show(cmd *exec.Cmd) error {
return c.Runner.Show(cmd)
}
func (c *CmdBuilder) Capture(cmd *exec.Cmd, timeout int64) (stdout, stderr string, err error) {
return c.Runner.Capture(cmd, timeout)
}

View File

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

View File

@ -17,6 +17,7 @@ import (
"github.com/Jguer/yay/v10/pkg/db/mock"
"github.com/Jguer/yay/v10/pkg/settings"
"github.com/Jguer/yay/v10/pkg/settings/exe"
"github.com/Jguer/yay/v10/pkg/vcs"
)
@ -109,7 +110,7 @@ func Test_upDevel(t *testing.T) {
config, err := settings.NewConfig("v0")
assert.NoError(t, err)
config.Runtime.CmdRunner = &MockRunner{
config.Runtime.CmdBuilder = config.CmdBuilder(&MockRunner{
Returned: []string{
"7f4c277ce7149665d1c79b76ca8fbb832a65a03b HEAD",
"7f4c277ce7149665d1c79b76ca8fbb832a65a03b HEAD",
@ -117,7 +118,7 @@ func Test_upDevel(t *testing.T) {
"cccccccccccccccccccccccccccccccccccccccc HEAD",
"991c5b4146fd27f4aacf4e3111258a848934aaa1 HEAD",
},
}
})
type args struct {
remote []alpm.IPackage
@ -134,7 +135,6 @@ func Test_upDevel(t *testing.T) {
name: "No Updates",
args: args{
cached: vcs.InfoStore{
Runner: config.Runtime.CmdRunner,
CmdBuilder: config.Runtime.CmdBuilder,
},
remote: []alpm.IPackage{
@ -154,7 +154,6 @@ func Test_upDevel(t *testing.T) {
finalLen: 3,
args: args{
cached: vcs.InfoStore{
Runner: config.Runtime.CmdRunner,
CmdBuilder: config.Runtime.CmdBuilder,
OriginsByPackage: map[string]vcs.OriginInfoByURL{
"hello": {
@ -225,7 +224,6 @@ func Test_upDevel(t *testing.T) {
finalLen: 1,
args: args{
cached: vcs.InfoStore{
Runner: config.Runtime.CmdRunner,
CmdBuilder: config.Runtime.CmdBuilder,
OriginsByPackage: map[string]vcs.OriginInfoByURL{
"hello": {
@ -247,7 +245,6 @@ func Test_upDevel(t *testing.T) {
finalLen: 1,
args: args{
cached: vcs.InfoStore{
Runner: config.Runtime.CmdRunner,
CmdBuilder: config.Runtime.CmdBuilder,
OriginsByPackage: map[string]vcs.OriginInfoByURL{
"hello": {
@ -267,7 +264,7 @@ func Test_upDevel(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
config.Runtime.CmdRunner.(*MockRunner).t = t
config.Runtime.CmdBuilder.(*exe.CmdBuilder).Runner.(*MockRunner).t = t
got := UpDevel(tt.args.remote, tt.args.aurdata, &tt.args.cached)
assert.ElementsMatch(t, tt.want.Up, got.Up)
assert.Equal(t, tt.finalLen, len(tt.args.cached.OriginsByPackage))

View File

@ -20,7 +20,6 @@ import (
type InfoStore struct {
OriginsByPackage map[string]OriginInfoByURL
FilePath string
Runner exe.Runner
CmdBuilder exe.GitCmdBuilder
}
@ -42,12 +41,11 @@ type OriginInfo struct {
SHA string `json:"sha"`
}
func NewInfoStore(filePath string, runner exe.Runner, cmdBuilder exe.GitCmdBuilder) *InfoStore {
func NewInfoStore(filePath string, cmdBuilder exe.GitCmdBuilder) *InfoStore {
infoStore := &InfoStore{
CmdBuilder: cmdBuilder,
FilePath: filePath,
OriginsByPackage: map[string]OriginInfoByURL{},
Runner: runner,
}
return infoStore
@ -59,7 +57,7 @@ func (v *InfoStore) getCommit(url, branch string, protocols []string) string {
protocol := protocols[len(protocols)-1]
cmd := v.CmdBuilder.BuildGitCmd("", "ls-remote", protocol+"://"+url, branch)
stdout, _, err := v.Runner.Capture(cmd, 5)
stdout, _, err := v.CmdBuilder.Capture(cmd, 5)
if err != nil {
if exiterr, ok := err.(*exec.ExitError); ok && exiterr.ExitCode() == 128 {
text.Warnln(gotext.Get("devel check for package failed: '%s' encountered an error", cmd.String()))

View File

@ -55,7 +55,6 @@ func TestParsing(t *testing.T) {
func TestNewInfoStore(t *testing.T) {
type args struct {
filePath string
runner exe.Runner
cmdBuilder *exe.CmdBuilder
}
tests := []struct {
@ -66,18 +65,16 @@ func TestNewInfoStore(t *testing.T) {
name: "normal",
args: args{
"/tmp/a.json",
&exe.OSRunner{},
&exe.CmdBuilder{GitBin: "git", GitFlags: []string{"--a", "--b"}},
&exe.CmdBuilder{GitBin: "git", GitFlags: []string{"--a", "--b"}, Runner: &exe.OSRunner{}},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := NewInfoStore(tt.args.filePath, tt.args.runner, tt.args.cmdBuilder)
got := NewInfoStore(tt.args.filePath, tt.args.cmdBuilder)
assert.NotNil(t, got)
assert.Equal(t, []string{"--a", "--b"}, got.CmdBuilder.(*exe.CmdBuilder).GitFlags)
assert.Equal(t, tt.args.cmdBuilder, got.CmdBuilder)
assert.Equal(t, tt.args.runner, got.Runner)
assert.Equal(t, "/tmp/a.json", got.FilePath)
})
}
@ -102,7 +99,6 @@ func (r *MockRunner) Capture(cmd *exec.Cmd, timeout int64) (stdout, stderr strin
func TestInfoStore_NeedsUpdate(t *testing.T) {
type fields struct {
Runner exe.Runner
CmdBuilder *exe.CmdBuilder
}
type args struct {
@ -123,10 +119,9 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
SHA: "991c5b4146fd27f4aacf4e3111258a848934aaa1",
},
}}, fields: fields{
Runner: &MockRunner{
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}, Runner: &MockRunner{
Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD"},
},
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}},
}},
},
want: true,
},
@ -144,13 +139,12 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
SHA: "991c5b4146fd27f4aacf4e3111258a848934aaa1",
},
}}, fields: fields{
Runner: &MockRunner{
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}, Runner: &MockRunner{
Returned: []string{
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD",
},
},
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}},
}},
},
want: true,
},
@ -163,10 +157,9 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
SHA: "991c5b4146fd27f4aacf4e3111258a848934aaa1",
},
}}, fields: fields{
Runner: &MockRunner{
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}, Runner: &MockRunner{
Returned: []string{"991c5b4146fd27f4aacf4e3111258a848934aaa1 HEAD"},
},
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}},
}},
},
want: false,
},
@ -179,10 +172,9 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
SHA: "991c5b4146fd27f4aacf4e3111258a848934aaa1",
},
}}, fields: fields{
Runner: &MockRunner{
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}, Runner: &MockRunner{
Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
},
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}},
}},
},
want: false,
},
@ -195,10 +187,12 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
SHA: "991c5b4146fd27f4aacf4e3111258a848934aaa1",
},
}}, fields: fields{
Runner: &MockRunner{
Returned: []string{"error"},
CmdBuilder: &exe.CmdBuilder{
GitBin: "git", GitFlags: []string{""},
Runner: &MockRunner{
Returned: []string{"error"},
},
},
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}},
},
want: false,
},
@ -211,10 +205,9 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
SHA: "991c5b4146fd27f4aacf4e3111258a848934aaa1",
},
}}, fields: fields{
Runner: &MockRunner{
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}, Runner: &MockRunner{
Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"},
},
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}},
}},
},
want: false,
},
@ -222,7 +215,6 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
v := &InfoStore{
Runner: tt.fields.Runner,
CmdBuilder: tt.fields.CmdBuilder,
}
got := v.NeedsUpdate(tt.args.infos)
@ -234,7 +226,6 @@ func TestInfoStore_NeedsUpdate(t *testing.T) {
func TestInfoStore_Update(t *testing.T) {
type fields struct {
OriginsByPackage map[string]OriginInfoByURL
Runner exe.Runner
CmdBuilder *exe.CmdBuilder
}
type args struct {
@ -254,8 +245,10 @@ func TestInfoStore_Update(t *testing.T) {
},
fields: fields{
OriginsByPackage: make(map[string]OriginInfoByURL),
CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}},
Runner: &MockRunner{Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD"}},
CmdBuilder: &exe.CmdBuilder{
GitBin: "git", GitFlags: []string{""},
Runner: &MockRunner{Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD"}},
},
},
},
}
@ -269,7 +262,6 @@ func TestInfoStore_Update(t *testing.T) {
v := &InfoStore{
OriginsByPackage: tt.fields.OriginsByPackage,
FilePath: file.Name(),
Runner: tt.fields.Runner,
CmdBuilder: tt.fields.CmdBuilder,
}
var mux sync.Mutex

View File

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

2
vcs.go
View File

@ -47,7 +47,7 @@ func createDevelDB(config *settings.Configuration, dbExecutor db.Executor) error
len(toSkipSlice), len(bases), text.Cyan(strings.Join(toSkipSlice, ", "))))
}
if _, errA := download.AURPKGBUILDRepos(config.Runtime.CmdRunner,
if _, errA := download.AURPKGBUILDRepos(
config.Runtime.CmdBuilder, targets, config.AURURL, config.BuildDir, false); errA != nil {
return err
}