|
@@ -6,51 +6,58 @@ import (
|
|
|
"fmt"
|
|
|
"io"
|
|
|
"os"
|
|
|
+ "os/exec"
|
|
|
"path/filepath"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
+var cmdArgs *arguments = makeArguments()
|
|
|
+
|
|
|
func usage() {
|
|
|
- fmt.Println(`usage: yay <operation> [...]
|
|
|
- operations:
|
|
|
- yay {-h --help}
|
|
|
- yay {-V --version}
|
|
|
- yay {-D --database} <options> <package(s)>
|
|
|
- yay {-F --files} [options] [package(s)]
|
|
|
- yay {-Q --query} [options] [package(s)]
|
|
|
- yay {-R --remove} [options] <package(s)>
|
|
|
- yay {-S --sync} [options] [package(s)]
|
|
|
- yay {-T --deptest} [options] [package(s)]
|
|
|
- yay {-U --upgrade} [options] <file(s)>
|
|
|
-
|
|
|
- New operations:
|
|
|
- yay -Qstats displays system information
|
|
|
- yay -Cd remove unneeded dependencies
|
|
|
- yay -G [package(s)] get pkgbuild from ABS or AUR
|
|
|
- yay --gendb generates development package DB used for updating.
|
|
|
-
|
|
|
- Permanent configuration options:
|
|
|
- --topdown shows repository's packages first and then aur's
|
|
|
- --bottomup shows aur's packages first and then repository's
|
|
|
- --devel Check -git/-svn/-hg development version
|
|
|
- --nodevel Disable development version checking
|
|
|
- --afterclean Clean package sources after successful build
|
|
|
- --noafterclean Disable package sources cleaning after successful build
|
|
|
- --timeupdate Check package's modification date and version
|
|
|
- --notimeupdate Check only package version change
|
|
|
-
|
|
|
- New options:
|
|
|
- --noconfirm skip user input on package install
|
|
|
- --printconfig Prints current yay configuration
|
|
|
- `)
|
|
|
+ fmt.Println(`Usage:
|
|
|
+ yay <operation> [...]
|
|
|
+ yay <package(s)>
|
|
|
+
|
|
|
+operations:
|
|
|
+ yay {-h --help}
|
|
|
+ yay {-V --version}
|
|
|
+ yay {-D --database} <options> <package(s)>
|
|
|
+ yay {-F --files} [options] [package(s)]
|
|
|
+ yay {-Q --query} [options] [package(s)]
|
|
|
+ yay {-R --remove} [options] <package(s)>
|
|
|
+ yay {-S --sync} [options] [package(s)]
|
|
|
+ yay {-T --deptest} [options] [package(s)]
|
|
|
+ yay {-U --upgrade} [options] <file(s)>
|
|
|
+
|
|
|
+New operations:
|
|
|
+ yay {-Y --yay} [options] [package(s)]
|
|
|
+ yay {-G --getpkgbuild} [package(s)]
|
|
|
+
|
|
|
+Permanent configuration options:
|
|
|
+ --topdown Shows repository's packages first and then aur's
|
|
|
+ --bottomup Shows aur's packages first and then repository's
|
|
|
+ --devel Check -git/-svn/-hg development version
|
|
|
+ --nodevel Disable development version checking
|
|
|
+ --afterclean Clean package sources after successful build
|
|
|
+ --noafterclean Disable package sources cleaning after successful build
|
|
|
+ --timeupdate Check package's modification date and version
|
|
|
+ --notimeupdate Check only package version change
|
|
|
+
|
|
|
+Yay specific options:
|
|
|
+ --printconfig Prints current yay configuration
|
|
|
+ --stats Displays system information
|
|
|
+ --cleandeps Remove unneeded dependencies
|
|
|
+ --gendb Generates development package DB used for updating.
|
|
|
+
|
|
|
+If no operation is provided -Y will be assumed
|
|
|
+`)
|
|
|
}
|
|
|
|
|
|
-func init() {
|
|
|
+func initYay() (err error) {
|
|
|
var configHome string // configHome handles config directory home
|
|
|
var cacheHome string // cacheHome handles cache home
|
|
|
- var err error
|
|
|
|
|
|
if 0 == os.Geteuid() {
|
|
|
fmt.Println("Please avoid running yay as root/sudo.")
|
|
@@ -88,15 +95,15 @@ func init() {
|
|
|
if _, err = os.Stat(configFile); os.IsNotExist(err) {
|
|
|
err = os.MkdirAll(filepath.Dir(configFile), 0755)
|
|
|
if err != nil {
|
|
|
- fmt.Println("Unable to create config directory:", filepath.Dir(configFile), err)
|
|
|
- os.Exit(2)
|
|
|
+ err = fmt.Errorf("Unable to create config directory:", filepath.Dir(configFile), err)
|
|
|
+ return
|
|
|
}
|
|
|
// Save the default config if nothing is found
|
|
|
config.saveConfig()
|
|
|
} else {
|
|
|
cfile, errf := os.OpenFile(configFile, os.O_RDWR|os.O_CREATE, 0644)
|
|
|
if errf != nil {
|
|
|
- fmt.Println("Error reading config:", err)
|
|
|
+ fmt.Println("Error reading config: %s", err)
|
|
|
} else {
|
|
|
defer cfile.Close()
|
|
|
decoder := json.NewDecoder(cfile)
|
|
@@ -120,194 +127,343 @@ func init() {
|
|
|
_ = decoder.Decode(&savedInfo)
|
|
|
}
|
|
|
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func initAlpm() (err error) {
|
|
|
/////////////////
|
|
|
// alpm config //
|
|
|
/////////////////
|
|
|
+
|
|
|
+ var value string
|
|
|
+ var exists bool
|
|
|
+ //var double bool
|
|
|
+
|
|
|
+ value, _, exists = cmdArgs.getArg("config")
|
|
|
+ if exists {
|
|
|
+ config.PacmanConf = value
|
|
|
+ }
|
|
|
+
|
|
|
alpmConf, err = readAlpmConfig(config.PacmanConf)
|
|
|
if err != nil {
|
|
|
- fmt.Println("Unable to read Pacman conf", err)
|
|
|
- os.Exit(1)
|
|
|
+ err = fmt.Errorf("Unable to read Pacman conf: %s", err)
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
- alpmHandle, err = alpmConf.CreateHandle()
|
|
|
- if err != nil {
|
|
|
- fmt.Println("Unable to CreateHandle", err)
|
|
|
- os.Exit(1)
|
|
|
+ value, _, exists = cmdArgs.getArg("dbpath", "b")
|
|
|
+ if exists {
|
|
|
+ alpmConf.DBPath = value
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-func parser() (op string, options []string, packages []string, changedConfig bool, err error) {
|
|
|
- if len(os.Args) < 2 {
|
|
|
- err = fmt.Errorf("no operation specified")
|
|
|
- return
|
|
|
+ value, _, exists = cmdArgs.getArg("root", "r")
|
|
|
+ if exists {
|
|
|
+ alpmConf.RootDir = value
|
|
|
}
|
|
|
- changedConfig = false
|
|
|
- op = "yogurt"
|
|
|
|
|
|
- for _, arg := range os.Args[1:] {
|
|
|
- if len(arg) < 2 {
|
|
|
- continue
|
|
|
- }
|
|
|
- if arg[0] == '-' && arg[1] != '-' {
|
|
|
- switch arg {
|
|
|
- case "-V":
|
|
|
- arg = "--version"
|
|
|
- case "-h":
|
|
|
- arg = "--help"
|
|
|
- default:
|
|
|
- op = arg
|
|
|
- continue
|
|
|
- }
|
|
|
- }
|
|
|
+ value, _, exists = cmdArgs.getArg("arch")
|
|
|
+ if exists {
|
|
|
+ alpmConf.Architecture = value
|
|
|
+ }
|
|
|
|
|
|
- if strings.HasPrefix(arg, "--") {
|
|
|
- changedConfig = true
|
|
|
- switch arg {
|
|
|
- case "--afterclean":
|
|
|
- config.CleanAfter = true
|
|
|
- case "--noafterclean":
|
|
|
- config.CleanAfter = false
|
|
|
- case "--printconfig":
|
|
|
- fmt.Printf("%#v", config)
|
|
|
- os.Exit(0)
|
|
|
- case "--gendb":
|
|
|
- err = createDevelDB()
|
|
|
- if err != nil {
|
|
|
- fmt.Println(err)
|
|
|
- }
|
|
|
- err = saveVCSInfo()
|
|
|
- if err != nil {
|
|
|
- fmt.Println(err)
|
|
|
- }
|
|
|
- os.Exit(0)
|
|
|
- case "--devel":
|
|
|
- config.Devel = true
|
|
|
- case "--nodevel":
|
|
|
- config.Devel = false
|
|
|
- case "--timeupdate":
|
|
|
- config.TimeUpdate = true
|
|
|
- case "--notimeupdate":
|
|
|
- config.TimeUpdate = false
|
|
|
- case "--topdown":
|
|
|
- config.SortMode = TopDown
|
|
|
- case "--bottomup":
|
|
|
- config.SortMode = BottomUp
|
|
|
- case "--complete":
|
|
|
- config.Shell = "sh"
|
|
|
- _ = complete()
|
|
|
- os.Exit(0)
|
|
|
- case "--fcomplete":
|
|
|
- config.Shell = fishShell
|
|
|
- _ = complete()
|
|
|
- os.Exit(0)
|
|
|
- case "--help":
|
|
|
- usage()
|
|
|
- os.Exit(0)
|
|
|
- case "--version":
|
|
|
- fmt.Printf("yay v%s\n", version)
|
|
|
- os.Exit(0)
|
|
|
- case "--noconfirm":
|
|
|
- config.NoConfirm = true
|
|
|
- fallthrough
|
|
|
- default:
|
|
|
- options = append(options, arg)
|
|
|
- }
|
|
|
- continue
|
|
|
- }
|
|
|
- packages = append(packages, arg)
|
|
|
+ //TODO
|
|
|
+ //current system does not allow duplicate arguments
|
|
|
+ //but pacman allows multiple cachdirs to be passed
|
|
|
+ //for now only hanle one cache dir
|
|
|
+ value, _, exists = cmdArgs.getArg("cachdir")
|
|
|
+ if exists {
|
|
|
+ alpmConf.CacheDir = []string{value}
|
|
|
+ }
|
|
|
+
|
|
|
+ value, _, exists = cmdArgs.getArg("gpgdir")
|
|
|
+ if exists {
|
|
|
+ alpmConf.GPGDir = value
|
|
|
+ }
|
|
|
+
|
|
|
+ alpmHandle, err = alpmConf.CreateHandle()
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("Unable to CreateHandle", err)
|
|
|
+ return
|
|
|
}
|
|
|
+
|
|
|
return
|
|
|
}
|
|
|
|
|
|
func main() {
|
|
|
- op, options, pkgs, changedConfig, err := parser()
|
|
|
+ var status int
|
|
|
+ var err error
|
|
|
+ var changedConfig bool
|
|
|
+
|
|
|
+ err = cmdArgs.parseCommandLine()
|
|
|
if err != nil {
|
|
|
fmt.Println(err)
|
|
|
- os.Exit(1)
|
|
|
+ status = 1
|
|
|
+ goto cleanup
|
|
|
}
|
|
|
|
|
|
- switch op {
|
|
|
- case "-Cd":
|
|
|
- err = cleanDependencies(pkgs)
|
|
|
- case "-G":
|
|
|
- for _, pkg := range pkgs {
|
|
|
- err = getPkgbuild(pkg)
|
|
|
- if err != nil {
|
|
|
- fmt.Println(pkg+":", err)
|
|
|
- }
|
|
|
- }
|
|
|
- case "-Qstats":
|
|
|
- err = localStatistics()
|
|
|
- case "-Ss", "-Ssq", "-Sqs":
|
|
|
- if op == "-Ss" {
|
|
|
- config.SearchMode = Detailed
|
|
|
- } else {
|
|
|
- config.SearchMode = Minimal
|
|
|
+ err = initYay()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ status = 1
|
|
|
+ goto cleanup
|
|
|
+ }
|
|
|
+
|
|
|
+ err = initAlpm()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ status = 1
|
|
|
+ goto cleanup
|
|
|
+ }
|
|
|
+
|
|
|
+ changedConfig, err = handleCmd()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ status = 1
|
|
|
+ goto cleanup
|
|
|
+ }
|
|
|
+
|
|
|
+ //ive used a goto here
|
|
|
+ //i think its the best way to do this sort of thing
|
|
|
+cleanup:
|
|
|
+ //cleanup
|
|
|
+ //from here on out dont exit if an error occurs
|
|
|
+ //if we fail to save the configuration
|
|
|
+ //atleast continue on and try clean up other parts
|
|
|
+
|
|
|
+ if updated {
|
|
|
+ err = saveVCSInfo()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ status = 1
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- if pkgs != nil {
|
|
|
- err = syncSearch(pkgs)
|
|
|
+ if changedConfig {
|
|
|
+ err = config.saveConfig()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ status = 1
|
|
|
}
|
|
|
- case "-S":
|
|
|
- err = install(pkgs, options)
|
|
|
- case "-Sy":
|
|
|
- err = passToPacman("-Sy", nil, nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ if alpmHandle != nil {
|
|
|
+ err = alpmHandle.Release()
|
|
|
if err != nil {
|
|
|
- break
|
|
|
+ fmt.Println(err)
|
|
|
+ status = 1
|
|
|
}
|
|
|
- err = install(pkgs, options)
|
|
|
- case "-Syu", "-Suy", "-Su":
|
|
|
- if strings.Contains(op, "y") {
|
|
|
- err = passToPacman("-Sy", nil, nil)
|
|
|
- if err != nil {
|
|
|
- break
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ os.Exit(status)
|
|
|
+}
|
|
|
+
|
|
|
+func handleCmd() (changedConfig bool, err error) {
|
|
|
+ changedConfig = false
|
|
|
+
|
|
|
+ for option, _ := range cmdArgs.options {
|
|
|
+ changedConfig = changedConfig || handleConfig(option)
|
|
|
+ }
|
|
|
+
|
|
|
+ for option, _ := range cmdArgs.globals {
|
|
|
+ changedConfig = changedConfig || handleConfig(option)
|
|
|
+ }
|
|
|
+
|
|
|
+ switch cmdArgs.op {
|
|
|
+ case "V", "version":
|
|
|
+ handleVersion()
|
|
|
+ case "D", "database":
|
|
|
+ passToPacman(cmdArgs)
|
|
|
+ case "F", "files":
|
|
|
+ passToPacman(cmdArgs)
|
|
|
+ case "Q", "query":
|
|
|
+ passToPacman(cmdArgs)
|
|
|
+ case "R", "remove":
|
|
|
+ handleRemove()
|
|
|
+ case "S", "sync":
|
|
|
+ err = handleSync()
|
|
|
+ case "T", "deptest":
|
|
|
+ passToPacman(cmdArgs)
|
|
|
+ case "U", "upgrade":
|
|
|
+ passToPacman(cmdArgs)
|
|
|
+ case "G", "getpkgbuild":
|
|
|
+ err = handleGetpkgbuild()
|
|
|
+ case "Y", "--yay":
|
|
|
+ err = handleYay()
|
|
|
+ default:
|
|
|
+ //this means we allowed an op but not implement it
|
|
|
+ //if this happens it an error in the code and not the usage
|
|
|
+ err = fmt.Errorf("unhandled operation")
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//this function should only set config options
|
|
|
+//but currently still uses the switch left over from old code
|
|
|
+//eventuall this should be refactored out futher
|
|
|
+//my current plan is to have yay specific operations in its own operator
|
|
|
+//e.g. yay -Y --gendb
|
|
|
+//e.g yay -Yg
|
|
|
+func handleConfig(option string) (changedConfig bool) {
|
|
|
+ switch option {
|
|
|
+ case "afterclean":
|
|
|
+ config.CleanAfter = true
|
|
|
+ case "noafterclean":
|
|
|
+ config.CleanAfter = false
|
|
|
+ // case "printconfig":
|
|
|
+ // fmt.Printf("%#v", config)
|
|
|
+ // os.Exit(0)
|
|
|
+ // case "gendb":
|
|
|
+ // err = createDevelDB()
|
|
|
+ // if err != nil {
|
|
|
+ // fmt.Println(err)
|
|
|
+ // }
|
|
|
+ // err = saveVCSInfo()
|
|
|
+ // if err != nil {
|
|
|
+ // fmt.Println(err)
|
|
|
+ // }
|
|
|
+ // os.Exit(0)
|
|
|
+ case "devel":
|
|
|
+ config.Devel = true
|
|
|
+ case "nodevel":
|
|
|
+ config.Devel = false
|
|
|
+ case "timeupdate":
|
|
|
+ config.TimeUpdate = true
|
|
|
+ case "notimeupdate":
|
|
|
+ config.TimeUpdate = false
|
|
|
+ case "topdown":
|
|
|
+ config.SortMode = TopDown
|
|
|
+ case "--bottomup":
|
|
|
+ config.SortMode = BottomUp
|
|
|
+ // case "complete":
|
|
|
+ // config.Shell = "sh"
|
|
|
+ // complete()
|
|
|
+ // os.Exit(0)
|
|
|
+ // case "fcomplete":
|
|
|
+ // config.Shell = fishShell
|
|
|
+ // complete()
|
|
|
+ // os.Exit(0)
|
|
|
+ // case "help":
|
|
|
+ // usage()
|
|
|
+ // os.Exit(0)
|
|
|
+ // case "version":
|
|
|
+ // fmt.Printf("yay v%s\n", version)
|
|
|
+ // os.Exit(0)
|
|
|
+ case "noconfirm":
|
|
|
+ config.NoConfirm = true
|
|
|
+ default:
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ changedConfig = true
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func handleVersion() {
|
|
|
+ fmt.Printf("yay v%s\n", version)
|
|
|
+}
|
|
|
+
|
|
|
+func handleYay() (err error) {
|
|
|
+ //_, options, targets := cmdArgs.formatArgs()
|
|
|
+ if cmdArgs.existsArg("h", "help") {
|
|
|
+ usage()
|
|
|
+ } else if cmdArgs.existsArg("printconfig") {
|
|
|
+ fmt.Printf("%#v", config)
|
|
|
+ } else if cmdArgs.existsArg("gendb") {
|
|
|
+ err = createDevelDB()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
- err = upgradePkgs(options)
|
|
|
- case "-Si":
|
|
|
- err = syncInfo(pkgs, options)
|
|
|
- case "yogurt":
|
|
|
- config.SearchMode = NumberMenu
|
|
|
-
|
|
|
- if pkgs != nil {
|
|
|
- err = numberMenu(pkgs, options)
|
|
|
+ err = saveVCSInfo()
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
- default:
|
|
|
- if op[0] == 'R' {
|
|
|
- removeVCSPackage(pkgs)
|
|
|
+ } else if cmdArgs.existsArg("complete") {
|
|
|
+ config.Shell = "sh"
|
|
|
+ complete()
|
|
|
+ } else if cmdArgs.existsArg("fcomplete") {
|
|
|
+ config.Shell = "fish"
|
|
|
+ complete()
|
|
|
+ } else if cmdArgs.existsArg("stats") {
|
|
|
+ err = localStatistics()
|
|
|
+ } else if cmdArgs.existsArg("cleandeps") {
|
|
|
+ err = cleanDependencies()
|
|
|
+ } else if len(cmdArgs.targets) > 0 {
|
|
|
+ err = handleYogurt()
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func handleGetpkgbuild() (err error) {
|
|
|
+ for pkg := range cmdArgs.targets {
|
|
|
+ err = getPkgbuild(pkg)
|
|
|
+ if err != nil {
|
|
|
+ //we print the error instead of returning it
|
|
|
+ //seems as we can handle multiple errors without stoping
|
|
|
+ //theres no easy way arround this right now
|
|
|
+ fmt.Println(pkg+":", err)
|
|
|
}
|
|
|
- err = passToPacman(op, pkgs, options)
|
|
|
}
|
|
|
|
|
|
- var erra error
|
|
|
- if updated {
|
|
|
- erra = saveVCSInfo()
|
|
|
- if erra != nil {
|
|
|
- fmt.Println(err)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func handleYogurt() (err error) {
|
|
|
+ options := cmdArgs.formatArgs()
|
|
|
+ targets := cmdArgs.formatTargets()
|
|
|
+
|
|
|
+ config.SearchMode = NumberMenu
|
|
|
+ err = numberMenu(targets, options)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func handleSync() (err error) {
|
|
|
+ targets := cmdArgs.formatTargets()
|
|
|
+ options := cmdArgs.formatArgs()
|
|
|
+
|
|
|
+ if cmdArgs.existsArg("y", "refresh") {
|
|
|
+ arguments := cmdArgs.copy()
|
|
|
+ arguments.delArg("u", "sysupgrade")
|
|
|
+ arguments.targets = make(stringSet)
|
|
|
+ err = passToPacman(arguments)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if changedConfig {
|
|
|
- erra = config.saveConfig()
|
|
|
- if erra != nil {
|
|
|
- fmt.Println(err)
|
|
|
+ if cmdArgs.existsArg("s", "search") {
|
|
|
+ if cmdArgs.existsArg("q", "quiet") {
|
|
|
+ config.SearchMode = Minimal
|
|
|
+ } else {
|
|
|
+ config.SearchMode = Detailed
|
|
|
}
|
|
|
|
|
|
+ err = syncSearch(targets)
|
|
|
+ } else if cmdArgs.existsArg("c", "clean") {
|
|
|
+ err = passToPacman(cmdArgs)
|
|
|
+ } else if cmdArgs.existsArg("u", "sysupgrade") {
|
|
|
+ err = upgradePkgs(make([]string, 0))
|
|
|
+ } else if cmdArgs.existsArg("i", "info") {
|
|
|
+ err = syncInfo(targets, options)
|
|
|
+ } else if len(cmdArgs.targets) > 0 {
|
|
|
+ err = install(cmdArgs)
|
|
|
}
|
|
|
|
|
|
- erra = alpmHandle.Release()
|
|
|
- if erra != nil {
|
|
|
- fmt.Println(err)
|
|
|
- }
|
|
|
+ return
|
|
|
+}
|
|
|
|
|
|
- if err != nil {
|
|
|
- fmt.Println(err)
|
|
|
- os.Exit(1)
|
|
|
- }
|
|
|
+func handleRemove() (err error) {
|
|
|
+ removeVCSPackage(cmdArgs.formatTargets())
|
|
|
+ err = passToPacman(cmdArgs)
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
// NumberMenu presents a CLI for selecting packages to install.
|
|
|
func numberMenu(pkgS []string, flags []string) (err error) {
|
|
|
+ //func numberMenu(cmdArgs *arguments) (err error) {
|
|
|
var num int
|
|
|
|
|
|
aq, err := narrowSearch(pkgS, true)
|
|
@@ -315,6 +471,7 @@ func numberMenu(pkgS []string, flags []string) (err error) {
|
|
|
fmt.Println("Error during AUR search:", err)
|
|
|
}
|
|
|
numaq := len(aq)
|
|
|
+
|
|
|
pq, numpq, err := queryRepo(pkgS)
|
|
|
if err != nil {
|
|
|
return
|
|
@@ -369,11 +526,14 @@ func numberMenu(pkgS []string, flags []string) (err error) {
|
|
|
}
|
|
|
|
|
|
if len(repoI) != 0 {
|
|
|
- err = passToPacman("-S", repoI, flags)
|
|
|
+ arguments := makeArguments()
|
|
|
+ arguments.addArg("S")
|
|
|
+ arguments.addTarget(repoI...)
|
|
|
+ err = passToPacman(arguments)
|
|
|
}
|
|
|
|
|
|
if len(aurI) != 0 {
|
|
|
- err = aurInstall(aurI, flags)
|
|
|
+ err = aurInstall(aurI, nil)
|
|
|
}
|
|
|
|
|
|
return err
|
|
@@ -408,3 +568,40 @@ func complete() error {
|
|
|
_, err = io.Copy(os.Stdout, in)
|
|
|
return err
|
|
|
}
|
|
|
+
|
|
|
+// passToPacman outsorces execution to pacman binary without modifications.
|
|
|
+func passToPacman(args *arguments) error {
|
|
|
+ var cmd *exec.Cmd
|
|
|
+ argArr := make([]string, 0)
|
|
|
+
|
|
|
+ if args.needRoot() {
|
|
|
+ argArr = append(argArr, "sudo")
|
|
|
+ }
|
|
|
+
|
|
|
+ argArr = append(argArr, "pacman")
|
|
|
+ argArr = append(argArr, cmdArgs.formatGlobals()...)
|
|
|
+ argArr = append(argArr, args.formatArgs()...)
|
|
|
+ argArr = append(argArr, args.formatTargets()...)
|
|
|
+
|
|
|
+ cmd = exec.Command(argArr[0], argArr[1:]...)
|
|
|
+
|
|
|
+ cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
|
|
+ err := cmd.Run()
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+// passToMakepkg outsorces execution to makepkg binary without modifications.
|
|
|
+func passToMakepkg(dir string, args ...string) (err error) {
|
|
|
+ cmd := exec.Command(config.MakepkgBin, args...)
|
|
|
+ cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
|
|
+ cmd.Dir = dir
|
|
|
+ err = cmd.Run()
|
|
|
+ if err == nil {
|
|
|
+ _ = saveVCSInfo()
|
|
|
+ if config.CleanAfter {
|
|
|
+ fmt.Println("\x1b[1;32m==> CleanAfter enabled. Deleting source folder.\x1b[0m")
|
|
|
+ os.RemoveAll(dir)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|