Further integration for the argument system

Argument parsing now works mostly as expected for repo packages.
AUR packages are a little tricky becauce makepkg cant handle args such
as '--dbpath'.

Also out alpm handle does not read the commandline options so any
arguments relient on alpm will be ignored.

For now though it seems yay has gained back the functionality it once
had. While also having improved argument handling which should also be
expandable and make it easier to handle anything new that might have
been missed.
This commit is contained in:
morganamilo 2018-01-04 08:13:47 +00:00
parent 16b747cb2d
commit 232edc64a6
No known key found for this signature in database
GPG key ID: 6FE9E7996B0B082E
4 changed files with 93 additions and 81 deletions

View file

@ -55,7 +55,7 @@ func cleanRemove(pkgNames []string) (err error) {
} }
arguments := makeArguments() arguments := makeArguments()
arguments.addArg("R", "s", "n", "s", "noconfirm") arguments.addArg("R", "noconfirm")
arguments.addTarget(pkgNames...) arguments.addTarget(pkgNames...)
err = passToPacman(arguments) err = passToPacman(arguments)

148
cmd.go
View file

@ -13,6 +13,8 @@ import (
"time" "time"
) )
var cmdArgs *arguments = makeArguments()
func usage() { func usage() {
fmt.Println(`Usage: fmt.Println(`Usage:
yay <operation> [...] yay <operation> [...]
@ -158,8 +160,7 @@ func run() (status int) {
var err error var err error
var changedConfig bool var changedConfig bool
parser := makeArguments(); err = cmdArgs.parseCommandLine();
err = parser.parseCommandLine();
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -167,8 +168,8 @@ func run() (status int) {
return return
} }
if parser.existsArg("-") { if cmdArgs.existsArg("-") {
err = parser.parseStdin(); err = cmdArgs.parseStdin();
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -177,7 +178,7 @@ func run() (status int) {
} }
} }
changedConfig, err = handleCmd(parser) changedConfig, err = handleCmd()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@ -209,47 +210,43 @@ func run() (status int) {
} }
func handleCmd(parser *arguments) (changedConfig bool, err error) { func handleCmd() (changedConfig bool, err error) {
var _changedConfig bool changedConfig = false
for option, _ := range parser.options { for option, _ := range cmdArgs.options {
_changedConfig, err = handleConfig(option) changedConfig = changedConfig || handleConfig(option)
}
if err != nil {
return for option, _ := range cmdArgs.globals {
} changedConfig = changedConfig || handleConfig(option)
if _changedConfig {
changedConfig = true
}
} }
switch parser.op { switch cmdArgs.op {
case "V", "version": case "V", "version":
handleVersion(parser) handleVersion()
case "D", "database": case "D", "database":
passToPacman(parser) passToPacman(cmdArgs)
case "F", "files": case "F", "files":
passToPacman(parser) passToPacman(cmdArgs)
case "Q", "query": case "Q", "query":
passToPacman(parser) passToPacman(cmdArgs)
case "R", "remove": case "R", "remove":
handleRemove(parser) handleRemove()
case "S", "sync": case "S", "sync":
err = handleSync(parser) err = handleSync()
case "T", "deptest": case "T", "deptest":
passToPacman(parser) passToPacman(cmdArgs)
case "U", "upgrade": case "U", "upgrade":
passToPacman(parser) passToPacman(cmdArgs)
case "G", "getpkgbuild": case "G", "getpkgbuild":
err = handleGetpkgbuild(parser) err = handleGetpkgbuild()
case "Y", "--yay": case "Y", "--yay":
err = handleYay(parser) err = handleYay()
default: default:
//this means we allowed an op but not implement it //this means we allowed an op but not implement it
//if this happens it an error in the code and not the usage //if this happens it an error in the code and not the usage
err = fmt.Errorf("unhandled operation") err = fmt.Errorf("unhandled operation")
} }
return return
} }
@ -260,7 +257,7 @@ func handleCmd(parser *arguments) (changedConfig bool, err error) {
//my current plan is to have yay specific operations in its own operator //my current plan is to have yay specific operations in its own operator
//e.g. yay -Y --gendb //e.g. yay -Y --gendb
//e.g yay -Yg //e.g yay -Yg
func handleConfig(option string) (changedConfig bool, err error) { func handleConfig(option string) (changedConfig bool) {
switch option { switch option {
case "afterclean": case "afterclean":
config.CleanAfter = true config.CleanAfter = true
@ -313,17 +310,17 @@ func handleConfig(option string) (changedConfig bool, err error) {
return return
} }
func handleVersion(parser *arguments) { func handleVersion() {
fmt.Printf("yay v%s\n", version) fmt.Printf("yay v%s\n", version)
} }
func handleYay(parser *arguments) (err error) { func handleYay() (err error) {
//_, options, targets := parser.formatArgs() //_, options, targets := cmdArgs.formatArgs()
if parser.existsArg("h", "help") { if cmdArgs.existsArg("h", "help") {
usage() usage()
} else if parser.existsArg("printconfig") { } else if cmdArgs.existsArg("printconfig") {
fmt.Printf("%#v", config) fmt.Printf("%#v", config)
} else if parser.existsArg("gendb") { } else if cmdArgs.existsArg("gendb") {
err = createDevelDB() err = createDevelDB()
if err != nil { if err != nil {
return return
@ -332,25 +329,25 @@ func handleYay(parser *arguments) (err error) {
if err != nil { if err != nil {
return return
} }
} else if parser.existsArg("complete") { } else if cmdArgs.existsArg("complete") {
config.Shell = "sh" config.Shell = "sh"
complete() complete()
} else if parser.existsArg("fcomplete") { } else if cmdArgs.existsArg("fcomplete") {
config.Shell = "fish" config.Shell = "fish"
complete() complete()
} else if parser.existsArg("stats") { } else if cmdArgs.existsArg("stats") {
err = localStatistics() err = localStatistics()
} else if parser.existsArg("cleandeps") { } else if cmdArgs.existsArg("cleandeps") {
err = cleanDependencies() err = cleanDependencies()
} else { } else {
err = handleYogurt(parser) err = handleYogurt()
} }
return return
} }
func handleGetpkgbuild(parser *arguments) (err error) { func handleGetpkgbuild() (err error) {
for pkg := range parser.targets { for pkg := range cmdArgs.targets {
err = getPkgbuild(pkg) err = getPkgbuild(pkg)
if err != nil { if err != nil {
//we print the error instead of returning it //we print the error instead of returning it
@ -363,9 +360,9 @@ func handleGetpkgbuild(parser *arguments) (err error) {
return return
} }
func handleYogurt(parser *arguments) (err error) { func handleYogurt() (err error) {
options := parser.formatArgs() options := cmdArgs.formatArgs()
targets := parser.formatTargets() targets := cmdArgs.formatTargets()
config.SearchMode = NumberMenu config.SearchMode = NumberMenu
err = numberMenu(targets, options) err = numberMenu(targets, options)
@ -373,49 +370,50 @@ func handleYogurt(parser *arguments) (err error) {
return return
} }
func handleSync(parser *arguments) (err error) { func handleSync() (err error) {
targets := parser.formatTargets() targets := cmdArgs.formatTargets()
options := parser.formatArgs() options := cmdArgs.formatArgs()
if parser.existsArg("y", "refresh") { if cmdArgs.existsArg("y", "refresh") {
arguments := makeArguments() arguments := cmdArgs.copy()
arguments.addArg("S", "y") arguments.delArg("u", "sysupgrade")
arguments.targets = make(stringSet)
err = passToPacman(arguments) err = passToPacman(arguments)
if err != nil { if err != nil {
return return
} }
} }
if parser.existsArg("s", "search") { if cmdArgs.existsArg("s", "search") {
if parser.existsArg("q", "quiet") { if cmdArgs.existsArg("q", "quiet") {
config.SearchMode = Minimal config.SearchMode = Minimal
} else { } else {
config.SearchMode = Detailed config.SearchMode = Detailed
} }
err = syncSearch(targets) err = syncSearch(targets)
} else if parser.existsArg("c", "clean") { } else if cmdArgs.existsArg("c", "clean") {
err = passToPacman(parser) err = passToPacman(cmdArgs)
} else if parser.existsArg("u", "sysupgrade") { } else if cmdArgs.existsArg("u", "sysupgrade") {
err = upgradePkgs(make([]string,0)) err = upgradePkgs(make([]string,0))
} else if parser.existsArg("i", "info") { } else if cmdArgs.existsArg("i", "info") {
err = syncInfo(targets, options) err = syncInfo(targets, options)
} else if len(parser.targets) > 0 { } else if len(cmdArgs.targets) > 0 {
err = install(parser) err = install(cmdArgs)
} }
return return
} }
func handleRemove(parser *arguments) (err error){ func handleRemove() (err error){
removeVCSPackage(parser.formatTargets()) removeVCSPackage(cmdArgs.formatTargets())
err = passToPacman(parser) err = passToPacman(cmdArgs)
return return
} }
// NumberMenu presents a CLI for selecting packages to install. // NumberMenu presents a CLI for selecting packages to install.
func numberMenu(pkgS []string, flags []string) (err error) { func numberMenu(pkgS []string, flags []string) (err error) {
//func numberMenu(parser *arguments) (err error) { //func numberMenu(cmdArgs *arguments) (err error) {
var num int var num int
aq, err := narrowSearch(pkgS, true) aq, err := narrowSearch(pkgS, true)
@ -522,19 +520,25 @@ func complete() error {
} }
// passToPacman outsorces execution to pacman binary without modifications. // passToPacman outsorces execution to pacman binary without modifications.
func passToPacman(parser *arguments) error { func passToPacman(args *arguments) error {
var cmd *exec.Cmd var cmd *exec.Cmd
args := make([]string, 0) argArr := make([]string, 0)
if parser.needRoot() { if args.needRoot() {
args = append(args, "sudo") argArr = append(argArr, "sudo")
} }
args = append(args, "pacman")
args = append(args, parser.formatArgs()...) argArr = append(argArr, "pacman")
args = append(args, parser.formatTargets()...) argArr = append(argArr, cmdArgs.formatGlobals()...)
argArr = append(argArr, args.formatArgs()...)
argArr = append(argArr, args.formatTargets()...)
cmd = exec.Command(args[0], args[1:]...)
fmt.Println(cmdArgs)
fmt.Println(args)
fmt.Println(argArr)
cmd = exec.Command(argArr[0], argArr[1:]...)
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr

View file

@ -13,9 +13,10 @@ import (
func install(parser *arguments) error { func install(parser *arguments) error {
aurs, repos, _ := packageSlices(parser.targets.toSlice()) aurs, repos, _ := packageSlices(parser.targets.toSlice())
arguments := makeArguments() arguments := parser.copy()
arguments.op = parser.op arguments.delArg("u", "sysupgrade")
arguments.options = arguments.options arguments.delArg("y", "refresh")
arguments.targets = make(stringSet)
arguments.addTarget(repos...) arguments.addTarget(repos...)
if len(repos) != 0 { if len(repos) != 0 {
@ -135,13 +136,20 @@ func PkgInstall(a *rpc.Pkg, flags []string) (finalmdeps []string, err error) {
} }
} }
arguments := makeArguments() arguments := cmdArgs.copy()
arguments.addArg("S", "asdeps") arguments.addArg("asdeps")
depArgs := arguments.formatArgs() arguments.delArg("asexplicit", "ase", "asex")
arguments.delArg("u", "sysupgrade")
arguments.delArg("y", "refresh")
arguments.targets = make(stringSet)
var depArgs []string
if config.NoConfirm { if config.NoConfirm {
arguments.addArg("noconfirm") depArgs = []string{"--asdeps", "--noconfirm"}
} else {
depArgs = []string{"--asdeps"}
} }
// Repo dependencies // Repo dependencies
if len(repoDeps) != 0 { if len(repoDeps) != 0 {
errR := passToPacman(arguments) errR := passToPacman(arguments)

View file

@ -334,7 +334,7 @@ func upgradePkgs(flags []string) error {
} }
arguments := makeArguments() arguments := makeArguments()
arguments.addArg("-S --noconfirm") arguments.addArg("S", "noconfirm")
arguments.addArg(flags...) arguments.addArg(flags...)
arguments.addTarget(repoNames...) arguments.addTarget(repoNames...)