From 3b2bb28e81121a291a62986080206e6af64191fb Mon Sep 17 00:00:00 2001 From: jguer Date: Sat, 22 Aug 2020 01:24:52 +0200 Subject: [PATCH] feat(exe): AddMakepkg builder --- clean.go | 6 +++--- download.go | 30 ++++++++++++++++++++---------- exec.go | 24 ------------------------ install.go | 23 ++++++++++++++++------- pkg/settings/config.go | 13 ++++++++++--- pkg/settings/exe/passers.go | 31 +++++++++++++++++++++---------- pkg/vcs/vcs_test.go | 20 ++++++++++++-------- 7 files changed, 82 insertions(+), 65 deletions(-) diff --git a/clean.go b/clean.go index d56d09f6..b6df6f85 100644 --- a/clean.go +++ b/clean.go @@ -173,7 +173,7 @@ func cleanUntracked() error { dir := filepath.Join(config.BuildDir, file.Name()) if isGitRepository(dir) { - if err := config.Runtime.CmdRunner.Show(passToGit(dir, "clean", "-fx")); err != nil { + if err := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, "clean", "-fx")); err != nil { text.Warnln(gotext.Get("Unable to clean:"), dir) return err } @@ -198,12 +198,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(passToGit(dir, "reset", "--hard", "HEAD"), 0) + _, stderr, err := config.Runtime.CmdRunner.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(passToGit(dir, "clean", "-fx", "--exclude='*.pkg.*'")); err != nil { + if err := config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, "clean", "-fx", "--exclude='*.pkg.*'")); err != nil { fmt.Fprintln(os.Stderr, err) } } diff --git a/download.go b/download.go index 7f740d34..17bd0b1a 100644 --- a/download.go +++ b/download.go @@ -23,7 +23,9 @@ const gitDiffRefName = "AUR_SEEN" // 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(passToGit(filepath.Join(path, name), "update-ref", gitDiffRefName, "HEAD"), 0) + _, stderr, err := config.Runtime.CmdRunner.Capture( + config.Runtime.CmdBuilder.BuildGitCmd( + filepath.Join(path, name), "update-ref", gitDiffRefName, "HEAD"), 0) if err != nil { return fmt.Errorf("%s %s", stderr, err) } @@ -33,7 +35,9 @@ func gitUpdateSeenRef(path, name string) 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(passToGit(filepath.Join(path, name), "rev-parse", "--quiet", "--verify", gitDiffRefName), 0) + _, _, err := config.Runtime.CmdRunner.Capture( + config.Runtime.CmdBuilder.BuildGitCmd( + filepath.Join(path, name), "rev-parse", "--quiet", "--verify", gitDiffRefName), 0) return err == nil } @@ -41,7 +45,9 @@ 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(passToGit(filepath.Join(path, name), "rev-parse", gitDiffRefName), 0) + stdout, stderr, err := config.Runtime.CmdRunner.Capture( + config.Runtime.CmdBuilder.BuildGitCmd( + filepath.Join(path, name), "rev-parse", gitDiffRefName), 0) if err != nil { return "", fmt.Errorf("%s %s", stderr, err) } @@ -57,7 +63,7 @@ func getLastSeenHash(path, name string) (string, error) { func gitHasDiff(path, name string) (bool, error) { if gitHasLastSeenRef(path, name) { stdout, stderr, err := config.Runtime.CmdRunner.Capture( - passToGit(filepath.Join(path, name), "rev-parse", gitDiffRefName, "HEAD@{upstream}"), 0) + 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 +85,7 @@ func gitDownloadABS(url, path, name string) (bool, error) { } if _, errExist := os.Stat(filepath.Join(path, name)); os.IsNotExist(errExist) { - cmd := passToGit(path, "clone", "--no-progress", "--single-branch", + cmd := config.Runtime.CmdBuilder.BuildGitCmd(path, "clone", "--no-progress", "--single-branch", "-b", "packages/"+name, url, name) _, stderr, err := config.Runtime.CmdRunner.Capture(cmd, 0) if err != nil { @@ -91,7 +97,7 @@ func gitDownloadABS(url, path, name string) (bool, error) { return false, fmt.Errorf(gotext.Get("error reading %s", filepath.Join(path, name, ".git"))) } - cmd := passToGit(filepath.Join(path, name), "pull", "--ff-only") + cmd := config.Runtime.CmdBuilder.BuildGitCmd(filepath.Join(path, name), "pull", "--ff-only") _, stderr, err := config.Runtime.CmdRunner.Capture(cmd, 0) if err != nil { return false, fmt.Errorf(gotext.Get("error fetching %s: %s", name, stderr)) @@ -103,7 +109,7 @@ func gitDownloadABS(url, path, name string) (bool, error) { func gitDownload(url, path, name string) (bool, error) { _, err := os.Stat(filepath.Join(path, name, ".git")) if os.IsNotExist(err) { - cmd := passToGit(path, "clone", "--no-progress", url, name) + cmd := config.Runtime.CmdBuilder.BuildGitCmd(path, "clone", "--no-progress", url, name) _, stderr, errCapture := config.Runtime.CmdRunner.Capture(cmd, 0) if errCapture != nil { return false, fmt.Errorf(gotext.Get("error cloning %s: %s", name, stderr)) @@ -114,7 +120,7 @@ func gitDownload(url, path, name string) (bool, error) { return false, fmt.Errorf(gotext.Get("error reading %s", filepath.Join(path, name, ".git"))) } - cmd := passToGit(filepath.Join(path, name), "fetch") + cmd := config.Runtime.CmdBuilder.BuildGitCmd(filepath.Join(path, name), "fetch") _, stderr, err := config.Runtime.CmdRunner.Capture(cmd, 0) if err != nil { return false, fmt.Errorf(gotext.Get("error fetching %s: %s", name, stderr)) @@ -124,12 +130,16 @@ func gitDownload(url, path, name string) (bool, error) { } func gitMerge(path, name string) error { - _, stderr, err := config.Runtime.CmdRunner.Capture(passToGit(filepath.Join(path, name), "reset", "--hard", "HEAD"), 0) + _, stderr, err := config.Runtime.CmdRunner.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(passToGit(filepath.Join(path, name), "merge", "--no-edit", "--ff"), 0) + _, stderr, err = config.Runtime.CmdRunner.Capture( + config.Runtime.CmdBuilder.BuildGitCmd( + filepath.Join(path, name), "merge", "--no-edit", "--ff"), 0) if err != nil { return fmt.Errorf(gotext.Get("error merging %s: %s", name, stderr)) } diff --git a/exec.go b/exec.go index 6d10ed5b..fd63dcfe 100644 --- a/exec.go +++ b/exec.go @@ -81,27 +81,3 @@ func passToPacman(args *settings.Arguments) *exec.Cmd { } return exec.Command(argArr[0], argArr[1:]...) } - -func passToMakepkg(dir string, args ...string) *exec.Cmd { - args = append(args, strings.Fields(config.MFlags)...) - - if config.MakepkgConf != "" { - args = append(args, "--config", config.MakepkgConf) - } - - cmd := exec.Command(config.MakepkgBin, args...) - cmd.Dir = dir - return cmd -} - -func passToGit(dir string, _args ...string) *exec.Cmd { - args := strings.Fields(config.GitFlags) - if dir != "" { - args = append(args, "-C", dir) - } - args = append(args, _args...) - - cmd := exec.Command(config.GitBin, args...) - cmd.Env = append(os.Environ(), "GIT_TERMINAL_PROMPT=0") - return cmd -} diff --git a/install.go b/install.go index 052fda23..e215cd14 100644 --- a/install.go +++ b/install.go @@ -496,7 +496,8 @@ nextpkg: } func parsePackageList(dir string) (pkgdests map[string]string, pkgVersion string, err error) { - stdout, stderr, err := config.Runtime.CmdRunner.Capture(passToMakepkg(dir, "--packagelist"), 0) + stdout, stderr, err := config.Runtime.CmdRunner.Capture( + config.Runtime.CmdBuilder.BuildMakepkgCmd(dir, "--packagelist"), 0) if err != nil { return nil, "", fmt.Errorf("%s %s", stderr, err) } @@ -765,7 +766,7 @@ func showPkgbuildDiffs(bases []dep.Base, cloned stringset.StringSet) error { } else { args = append(args, "--color=never") } - _ = config.Runtime.CmdRunner.Show(passToGit(dir, args...)) + _ = config.Runtime.CmdRunner.Show(config.Runtime.CmdBuilder.BuildGitCmd(dir, args...)) } return errMulti.Return() @@ -922,7 +923,8 @@ func downloadPkgbuildsSources(bases []dep.Base, incompatible stringset.StringSet args = append(args, "--ignorearch") } - err = config.Runtime.CmdRunner.Show(passToMakepkg(dir, args...)) + err = config.Runtime.CmdRunner.Show( + config.Runtime.CmdBuilder.BuildMakepkgCmd(dir, args...)) if err != nil { return errors.New(gotext.Get("error downloading sources: %s", text.Cyan(base.String()))) } @@ -1032,7 +1034,8 @@ func buildInstallPkgbuilds( } // pkgver bump - if err = config.Runtime.CmdRunner.Show(passToMakepkg(dir, args...)); err != nil { + if err = config.Runtime.CmdRunner.Show( + config.Runtime.CmdBuilder.BuildMakepkgCmd(dir, args...)); err != nil { return errors.New(gotext.Get("error making: %s", base.String())) } @@ -1069,7 +1072,9 @@ func buildInstallPkgbuilds( } if installed { - err = config.Runtime.CmdRunner.Show(passToMakepkg(dir, "-c", "--nobuild", "--noextract", "--ignorearch")) + err = config.Runtime.CmdRunner.Show( + config.Runtime.CmdBuilder.BuildMakepkgCmd( + dir, "-c", "--nobuild", "--noextract", "--ignorearch")) if err != nil { return errors.New(gotext.Get("error making: %s", err)) } @@ -1080,7 +1085,9 @@ func buildInstallPkgbuilds( } if built { - err = config.Runtime.CmdRunner.Show(passToMakepkg(dir, "-c", "--nobuild", "--noextract", "--ignorearch")) + err = config.Runtime.CmdRunner.Show( + config.Runtime.CmdBuilder.BuildMakepkgCmd( + dir, "-c", "--nobuild", "--noextract", "--ignorearch")) if err != nil { return errors.New(gotext.Get("error making: %s", err)) } @@ -1093,7 +1100,9 @@ func buildInstallPkgbuilds( args = append(args, "--ignorearch") } - if errMake := config.Runtime.CmdRunner.Show(passToMakepkg(dir, args...)); errMake != nil { + if errMake := config.Runtime.CmdRunner.Show( + config.Runtime.CmdBuilder.BuildMakepkgCmd( + dir, args...)); errMake != nil { return errors.New(gotext.Get("error making: %s", base.String())) } } diff --git a/pkg/settings/config.go b/pkg/settings/config.go index e456fdc8..19914bf0 100644 --- a/pkg/settings/config.go +++ b/pkg/settings/config.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "github.com/leonelquinteros/gotext" @@ -196,9 +197,15 @@ func NewConfig() (*Configuration, error) { SaveConfig: false, CompletionPath: filepath.Join(cacheHome, completionFileName), CmdRunner: &exe.OSRunner{}, - CmdBuilder: exe.NewCmdBuilder(newConfig.GitBin, newConfig.GitFlags), - PacmanConf: nil, - VCSStore: nil, + 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, } newConfig.Runtime.VCSStore = vcs.NewInfoStore(filepath.Join(cacheHome, vcsFileName), diff --git a/pkg/settings/exe/passers.go b/pkg/settings/exe/passers.go index 58f7bbe8..3626afa6 100644 --- a/pkg/settings/exe/passers.go +++ b/pkg/settings/exe/passers.go @@ -3,22 +3,18 @@ package exe import ( "os" "os/exec" - "strings" ) type CmdBuilder struct { - GitBin string - GitFlags []string -} - -func NewCmdBuilder(gitBin, gitFlags string) *CmdBuilder { - c := &CmdBuilder{GitBin: gitBin, GitFlags: strings.Fields(gitFlags)} - - return c + GitBin string + GitFlags []string + MakepkgFlags []string + MakepkgConfPath string + MakepkgBin string } func (c *CmdBuilder) BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd { - args := make([]string, 0, len(c.GitFlags)) + args := make([]string, 0, len(c.GitFlags)+len(extraArgs)) copy(args, c.GitFlags) if dir != "" { @@ -31,3 +27,18 @@ func (c *CmdBuilder) BuildGitCmd(dir string, extraArgs ...string) *exec.Cmd { cmd.Env = append(os.Environ(), "GIT_TERMINAL_PROMPT=0") return cmd } + +func (c *CmdBuilder) BuildMakepkgCmd(dir string, extraArgs ...string) *exec.Cmd { + args := make([]string, 0, len(c.MakepkgFlags)+len(extraArgs)) + copy(args, c.MakepkgFlags) + + if c.MakepkgConfPath != "" { + args = append(args, "--config", c.MakepkgConfPath) + } + + args = append(args, extraArgs...) + + cmd := exec.Command(c.MakepkgBin, args...) + cmd.Dir = dir + return cmd +} diff --git a/pkg/vcs/vcs_test.go b/pkg/vcs/vcs_test.go index e1c877df..fec640d3 100644 --- a/pkg/vcs/vcs_test.go +++ b/pkg/vcs/vcs_test.go @@ -64,7 +64,11 @@ func TestNewInfoStore(t *testing.T) { }{ { name: "normal", - args: args{"/tmp/a.json", &exe.OSRunner{}, exe.NewCmdBuilder("git", "--a --b")}, + args: args{ + "/tmp/a.json", + &exe.OSRunner{}, + &exe.CmdBuilder{GitBin: "git", GitFlags: []string{"--a", "--b"}}, + }, }, } for _, tt := range tests { @@ -122,7 +126,7 @@ func TestInfoStore_NeedsUpdate(t *testing.T) { Runner: &MockRunner{ Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD"}, }, - CmdBuilder: exe.NewCmdBuilder("git", ""), + CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}}, }, want: true, }, @@ -146,7 +150,7 @@ func TestInfoStore_NeedsUpdate(t *testing.T) { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD", }, }, - CmdBuilder: exe.NewCmdBuilder("git", ""), + CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}}, }, want: true, }, @@ -162,7 +166,7 @@ func TestInfoStore_NeedsUpdate(t *testing.T) { Runner: &MockRunner{ Returned: []string{"991c5b4146fd27f4aacf4e3111258a848934aaa1 HEAD"}, }, - CmdBuilder: exe.NewCmdBuilder("git", ""), + CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}}, }, want: false, }, @@ -178,7 +182,7 @@ func TestInfoStore_NeedsUpdate(t *testing.T) { Runner: &MockRunner{ Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, }, - CmdBuilder: exe.NewCmdBuilder("git", ""), + CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}}, }, want: false, }, @@ -194,7 +198,7 @@ func TestInfoStore_NeedsUpdate(t *testing.T) { Runner: &MockRunner{ Returned: []string{"error"}, }, - CmdBuilder: exe.NewCmdBuilder("git", ""), + CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}}, }, want: false, }, @@ -210,7 +214,7 @@ func TestInfoStore_NeedsUpdate(t *testing.T) { Runner: &MockRunner{ Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}, }, - CmdBuilder: exe.NewCmdBuilder("git", ""), + CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}}, }, want: false, }, @@ -247,7 +251,7 @@ func TestInfoStore_Update(t *testing.T) { sources: []gosrc.ArchString{{Value: "git://github.com/jguer/yay.git#branch=master"}}}, fields: fields{ OriginsByPackage: make(map[string]OriginInfoByURL), - CmdBuilder: exe.NewCmdBuilder("git", ""), + CmdBuilder: &exe.CmdBuilder{GitBin: "git", GitFlags: []string{""}}, Runner: &MockRunner{Returned: []string{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa HEAD"}}, }, },