From 1c6bef93dbfce4a800a519ac84b21622513277bf Mon Sep 17 00:00:00 2001 From: Jguer Date: Sun, 2 Oct 2016 21:50:23 +0100 Subject: [PATCH] Multi package install --- actions.go | 14 +++++++++++++- aur/aur.go | 28 ++++++++++++++++++---------- pacman.go | 54 +++++++++++++++++++++++++++++++++++++++++++----------- yay.go | 32 +++++++++++++++++++------------- 4 files changed, 93 insertions(+), 35 deletions(-) diff --git a/actions.go b/actions.go index f8233be4..f7ebdcb6 100644 --- a/actions.go +++ b/actions.go @@ -8,6 +8,7 @@ import ( "github.com/Jguer/go-alpm" "github.com/Jguer/yay/aur" "os" + "os/exec" "strconv" "strings" ) @@ -55,7 +56,18 @@ func searchAndInstall(pkgName string, conf *alpm.PacmanConfig, flags string) (er } } - InstallPackage(strings.TrimSpace(pacBuffer.String()), conf, flags) + if pacBuffer.String() != "" { + var cmd *exec.Cmd + if flags == "" { + cmd = exec.Command("sudo", "pacman", "-S", strings.TrimSpace(pacBuffer.String())) + } else { + cmd = exec.Command("sudo", "pacman", "-S", strings.TrimSpace(pacBuffer.String()), flags) + } + cmd.Stdout = os.Stdout + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + err = cmd.Run() + } for _, aurpkg := range aurInstall { err = aurpkg.Install(BuildDir, conf, flags) diff --git a/aur/aur.go b/aur/aur.go index a96a991b..c29e5eb4 100644 --- a/aur/aur.go +++ b/aur/aur.go @@ -1,6 +1,7 @@ package aur import ( + "bytes" "encoding/json" "errors" "fmt" @@ -266,18 +267,25 @@ func (a *Result) Install(baseDir string, conf *alpm.PacmanConfig, flags string) return } - fmt.Println("\033[1m\x1b[32m==> Edit PKGBUILD?\033[0m\033[1m (y/N)\033[0m") var response string - fmt.Scanln(&response) - if strings.ContainsAny(response, "y & Y") { - editcmd := exec.Command(Editor, baseDir+a.Name+"/"+"PKGBUILD") - editcmd.Stdout = os.Stdout - editcmd.Stderr = os.Stderr - editcmd.Stdin = os.Stdin - err = editcmd.Run() - } + var dir bytes.Buffer + dir.WriteString(baseDir) + dir.WriteString(a.Name) + dir.WriteString("/") - err = os.Chdir(baseDir + a.Name) + if _, err := os.Stat(dir.String() + "PKGBUILD"); err == nil { + fmt.Println("\033[1m\x1b[32m==> Edit PKGBUILD?\033[0m\033[1m (y/N)\033[0m") + fmt.Scanln(&response) + if strings.ContainsAny(response, "y & Y") { + editcmd := exec.Command(Editor, dir.String()+"PKGBUILD") + editcmd.Stdout = os.Stdout + editcmd.Stderr = os.Stderr + editcmd.Stdin = os.Stdin + err = editcmd.Run() + } + } + + err = os.Chdir(dir.String()) if err != nil { return } diff --git a/pacman.go b/pacman.go index f2ce5c54..0d86c608 100644 --- a/pacman.go +++ b/pacman.go @@ -36,24 +36,56 @@ func readConfig(pacmanconf string) (conf alpm.PacmanConfig, err error) { } // InstallPackage handles package install -func InstallPackage(pkg string, conf *alpm.PacmanConfig, flags string) error { - if found, err := aur.IspkgInRepo(pkg, conf); found { - if err != nil { - return err +func InstallPackage(pkgs []string, conf *alpm.PacmanConfig, flags string) error { + h, err := conf.CreateHandle() + defer h.Release() + if err != nil { + return err + } + + dbList, err := h.SyncDbs() + if err != nil { + return err + } + + var foreign []string + var args []string + repocnt := 0 + args = append(args, "pacman") + args = append(args, "-S") + + for _, pkg := range pkgs { + found := false + for _, db := range dbList.Slice() { + _, err = db.PkgByName(pkg) + if err == nil { + found = true + args = append(args, pkg) + repocnt++ + break + } } - var cmd *exec.Cmd - if flags == "" { - cmd = exec.Command("sudo", "pacman", "-S", pkg) - } else { - cmd = exec.Command("sudo", "pacman", "-S", pkg, flags) + if !found { + foreign = append(foreign, pkg) } + } + + if flags != "" { + args = append(args, flags) + } + + if repocnt != 0 { + var cmd *exec.Cmd + cmd = exec.Command("sudo", args...) cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin cmd.Stderr = os.Stderr err = cmd.Run() - } else { - err = aur.Install(pkg, BuildDir, conf, flags) + } + + for _, aurpkg := range foreign { + err = aur.Install(aurpkg, BuildDir, conf, flags) } return nil diff --git a/yay.go b/yay.go index ff949b85..f27359d6 100644 --- a/yay.go +++ b/yay.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "errors" "fmt" "os" @@ -28,20 +29,14 @@ func operation() (operation string, err error) { return "yogurt", nil } -func packages() (packages string, err error) { +func packages() ([]string, error) { var ps []string for _, arg := range os.Args[1:] { if arg[0] != '-' { ps = append(ps, arg) } } - - if len(ps) == 0 { - return "", nil - } - packages = strings.Join(ps, " ") - - return + return ps, nil } func flags() (flags string, err error) { @@ -62,6 +57,7 @@ func flags() (flags string, err error) { func main() { var err error + var pkgstring bytes.Buffer conf, err := readConfig(PacmanConf) op, err := operation() @@ -70,21 +66,31 @@ func main() { os.Exit(1) } - pkg, _ := packages() + pkgs, _ := packages() flag, _ := flags() switch op { case "-Ss": - err = searchMode(pkg, &conf) + for _, pkg := range pkgs { + err = searchMode(pkg, &conf) + } case "-S": - err = InstallPackage(pkg, &conf, flag) + err = InstallPackage(pkgs, &conf, flag) case "-Syu": err = updateAndInstall(&conf, flag) case "yogurt": - err = searchAndInstall(pkg, &conf, flag) + for _, pkg := range pkgs { + err = searchAndInstall(pkg, &conf, flag) + } default: - err = passToPacman(op, pkg, flag) + for i, pkg := range pkgs { + pkgstring.WriteString(pkg) + if i != len(pkgs)-1 { + pkgstring.WriteString(" ") + } + } + err = passToPacman(op, pkgstring.String(), flag) } if err != nil {