Refactor code. Implemented yay -Ssq.

This commit is contained in:
Jguer 2017-01-05 16:13:52 +00:00
parent c7e0d04ce3
commit 7e2625d362
9 changed files with 132 additions and 151 deletions

View file

@ -11,35 +11,9 @@ import (
"github.com/jguer/yay/aur"
pac "github.com/jguer/yay/pacman"
"github.com/jguer/yay/util"
)
// SearchMode is search without numbers.
const SearchMode int = -1
// SortMode NumberMenu and Search
var SortMode = DownTop
// NoConfirm ignores prompts.
var NoConfirm = false
// BaseDir is the default building directory for yay
var BaseDir = "/tmp/yaytmp/"
// Determines NumberMenu and Search Order
const (
DownTop = iota
TopDown
)
// Config copies settings over to AUR and Pacman packages
func Config() {
aur.SortMode = SortMode
pac.SortMode = SortMode
aur.NoConfirm = NoConfirm
pac.NoConfirm = NoConfirm
aur.BaseDir = BaseDir
}
// NumberMenu presents a CLI for selecting packages to install.
func NumberMenu(pkgName string, flags []string) (err error) {
var num int
@ -58,11 +32,11 @@ func NumberMenu(pkgName string, flags []string) (err error) {
return fmt.Errorf("no packages match search")
}
if aur.SortMode == aur.DownTop {
if util.SortMode == util.BottomUp {
a.PrintSearch(nR)
r.PrintSearch(0)
r.PrintSearch()
} else {
r.PrintSearch(0)
r.PrintSearch()
a.PrintSearch(nR)
}
@ -87,13 +61,13 @@ func NumberMenu(pkgName string, flags []string) (err error) {
if num > nA+nR-1 || num < 0 {
continue
} else if num > nR-1 {
if aur.SortMode == aur.DownTop {
if util.SortMode == util.BottomUp {
aurInstall = append(aurInstall, a[nA+nR-num-1].Name)
} else {
aurInstall = append(aurInstall, a[num-nR].Name)
}
} else {
if aur.SortMode == aur.DownTop {
if util.SortMode == util.BottomUp {
repoInstall = append(repoInstall, r[nR-num-1].Name)
} else {
repoInstall = append(repoInstall, r[num].Name)
@ -184,12 +158,12 @@ func Search(pkg string) (err error) {
return err
}
if SortMode == aur.DownTop {
a.PrintSearch(SearchMode)
r.PrintSearch(SearchMode)
if util.SortMode == util.BottomUp {
a.PrintSearch(0)
r.PrintSearch()
} else {
r.PrintSearch(SearchMode)
a.PrintSearch(SearchMode)
r.PrintSearch()
a.PrintSearch(0)
}
return nil
@ -326,7 +300,7 @@ func CleanDependencies(pkgs []string) error {
}
if len(hanging) != 0 {
if !continueTask("Confirm Removal?", "nN") {
if !util.ContinueTask("Confirm Removal?", "nN") {
return nil
}
err = pac.CleanRemove(hanging)
@ -334,26 +308,3 @@ func CleanDependencies(pkgs []string) error {
return err
}
func continueTask(s string, def string) (cont bool) {
if NoConfirm {
return true
}
var postFix string
if def == "nN" {
postFix = "(Y/n)"
} else {
postFix = "(y/N)"
}
var response string
fmt.Printf("\x1b[1;32m==> %s\x1b[1;37m %s\x1b[0m\n", s, postFix)
fmt.Scanln(&response)
if response == string(def[0]) || response == string(def[1]) {
return false
}
return true
}

View file

@ -4,6 +4,7 @@ import (
"fmt"
"github.com/jguer/yay/pacman"
"github.com/jguer/yay/util"
)
// Install sends system commands to make and install a package from pkgName
@ -61,7 +62,7 @@ func Upgrade(flags []string) error {
}
// Install updated packages
if !continueTask("Proceed with upgrade?", "nN") {
if !util.ContinueTask("Proceed with upgrade?", "nN") {
return nil
}

View file

@ -5,6 +5,7 @@ import (
"sort"
"github.com/jguer/yay/pacman"
"github.com/jguer/yay/util"
)
// Query is a collection of Results
@ -15,7 +16,7 @@ func (q Query) Len() int {
}
func (q Query) Less(i, j int) bool {
if SortMode == DownTop {
if util.SortMode == util.BottomUp {
return q[i].NumVotes < q[j].NumVotes
}
return q[i].NumVotes > q[j].NumVotes
@ -29,12 +30,15 @@ func (q Query) Swap(i, j int) {
func (q Query) PrintSearch(start int) {
for i, res := range q {
var toprint string
if start != SearchMode {
if SortMode == DownTop {
if util.SearchVerbosity == util.NumberMenu {
if util.SortMode == util.BottomUp {
toprint += fmt.Sprintf("%d ", len(q)+start-i-1)
} else {
toprint += fmt.Sprintf("%d ", start+i)
}
} else if util.SearchVerbosity == util.Minimal {
fmt.Println(res.Name)
continue
}
toprint += fmt.Sprintf("\x1b[1m%s/\x1b[33m%s \x1b[36m%s \x1b[0m(%d) ", "aur", res.Name, res.Version, res.NumVotes)
if res.Maintainer == "" {
@ -51,6 +55,8 @@ func (q Query) PrintSearch(start int) {
toprint += "\n" + res.Description
fmt.Println(toprint)
}
return
}
// Info returns an AUR search with package details

View file

@ -6,6 +6,7 @@ import (
"os/exec"
"github.com/jguer/yay/pacman"
"github.com/jguer/yay/util"
)
// Result describes an AUR package.
@ -95,22 +96,22 @@ func (a *Result) Install(flags []string) (finalmdeps []string, err error) {
if a.Maintainer == "" {
fmt.Println("\x1b[1;31;40m==> Warning:\x1b[0;;40m This package is orphaned.\x1b[0m")
}
dir := BaseDir + a.PackageBase + "/"
dir := util.BaseDir + a.PackageBase + "/"
if _, err = os.Stat(dir); os.IsNotExist(err) {
if err = a.setupWorkspace(); err != nil {
return
}
} else {
if !continueTask("Directory exists. Clean Build?", "yY") {
os.RemoveAll(BaseDir + a.PackageBase)
if !util.ContinueTask("Directory exists. Clean Build?", "yY") {
os.RemoveAll(util.BaseDir + a.PackageBase)
if err = a.setupWorkspace(); err != nil {
return
}
}
}
if !continueTask("Edit PKGBUILD?", "yY") {
if !util.ContinueTask("Edit PKGBUILD?", "yY") {
editcmd := exec.Command(Editor, dir+"PKGBUILD")
editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr
editcmd.Run()
@ -127,7 +128,7 @@ func (a *Result) Install(flags []string) (finalmdeps []string, err error) {
finalmdeps = append(finalmdeps, makeDeps[1]...)
if len(aurDeps) != 0 || len(repoDeps) != 0 {
if !continueTask("Continue?", "nN") {
if !util.ContinueTask("Continue?", "nN") {
return finalmdeps, fmt.Errorf("user did not like the dependencies")
}
}
@ -135,7 +136,7 @@ func (a *Result) Install(flags []string) (finalmdeps []string, err error) {
aurQ, n, err := MultiInfo(aurDeps)
if n != len(aurDeps) {
aurQ.MissingPackage(aurDeps)
if !continueTask("Continue?", "nN") {
if !util.ContinueTask("Continue?", "nN") {
return finalmdeps, fmt.Errorf("unable to install dependencies")
}
}
@ -169,7 +170,7 @@ func (a *Result) Install(flags []string) (finalmdeps []string, err error) {
var args []string
args = append(args, "-sri")
args = append(args, flags...)
makepkgcmd = exec.Command(MakepkgBin, args...)
makepkgcmd = exec.Command(util.MakepkgBin, args...)
makepkgcmd.Stdin, makepkgcmd.Stdout, makepkgcmd.Stderr = os.Stdin, os.Stdout, os.Stderr
err = makepkgcmd.Run()
return
@ -238,7 +239,7 @@ func RemoveMakeDeps(depS []string) (err error) {
hanging := pacman.SliceHangingPackages(depS)
if len(hanging) != 0 {
if !continueTask("Confirm Removal?", "nN") {
if !util.ContinueTask("Confirm Removal?", "nN") {
return nil
}
err = pacman.CleanRemove(hanging)
@ -249,21 +250,21 @@ func RemoveMakeDeps(depS []string) (err error) {
func (a *Result) setupWorkspace() (err error) {
// No need to use filepath.separators because it won't run on inferior platforms
err = os.MkdirAll(BaseDir+"builds", 0755)
err = os.MkdirAll(util.BaseDir+"builds", 0755)
if err != nil {
fmt.Println(err)
return
}
tarLocation := BaseDir + a.PackageBase + ".tar.gz"
defer os.Remove(BaseDir + a.PackageBase + ".tar.gz")
tarLocation := util.BaseDir + a.PackageBase + ".tar.gz"
defer os.Remove(util.BaseDir + a.PackageBase + ".tar.gz")
err = downloadFile(tarLocation, BaseURL+a.URLPath)
if err != nil {
return
}
err = exec.Command(TarBin, "-xf", tarLocation, "-C", BaseDir).Run()
err = exec.Command(util.TarBin, "-xf", tarLocation, "-C", util.BaseDir).Run()
if err != nil {
return
}

View file

@ -2,41 +2,16 @@ package aur
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
)
// Editor gives the default system editor, uses vi in last case
var Editor = "vi"
// TarBin describes the default installation point of tar command.
const TarBin string = "/usr/bin/tar"
// BaseURL givers the AUR default address.
const BaseURL string = "https://aur.archlinux.org"
// MakepkgBin describes the default installation point of makepkg command.
const MakepkgBin string = "/usr/bin/makepkg"
// SearchMode is search without numbers.
const SearchMode int = -1
// NoConfirm ignores prompts.
var NoConfirm = false
// SortMode determines top down package or down top package display
var SortMode = DownTop
// BaseDir is the default building directory for yay
var BaseDir = "/tmp/yaytmp/"
// Describes Sorting method for numberdisplay
const (
DownTop = iota
TopDown
)
// Editor gives the default system editor, uses vi in last case
var Editor = "vi"
func init() {
if os.Getenv("EDITOR") != "" {
@ -74,26 +49,3 @@ func downloadFile(filepath string, url string) (err error) {
_, err = io.Copy(out, resp.Body)
return err
}
func continueTask(s string, def string) (cont bool) {
if NoConfirm {
return true
}
var postFix string
if def == "nN" {
postFix = "(Y/n)"
} else {
postFix = "(y/N)"
}
var response string
fmt.Printf("\x1b[1;32m==> %s\x1b[1;37m %s\x1b[0m\n", s, postFix)
fmt.Scanln(&response)
if response == string(def[0]) || response == string(def[1]) {
return false
}
return true
}

View file

@ -5,6 +5,7 @@ import (
"os"
"github.com/jguer/yay"
"github.com/jguer/yay/util"
)
func usage() {
@ -22,6 +23,7 @@ func usage() {
New operations:
yay -Qstats displays system information
yay -Cd remove unneeded dependencies
New options:
--topdown shows repository's packages first and then aur's
@ -47,11 +49,11 @@ func parser() (op string, options []string, packages []string, err error) {
if arg == "--help" {
op = arg
} else if arg == "--topdown" {
yay.SortMode = yay.TopDown
} else if arg == "--downtop" {
yay.SortMode = yay.DownTop
util.SortMode = util.TopDown
} else if arg == "--bottomup" {
util.SortMode = util.BottomUp
} else if arg == "--noconfirm" {
yay.NoConfirm = true
util.NoConfirm = true
options = append(options, arg)
} else {
options = append(options, arg)
@ -77,14 +79,17 @@ func main() {
os.Exit(1)
}
yay.Config()
switch op {
case "-Cd":
err = yay.CleanDependencies(pkgs)
case "-Qstats":
err = yay.LocalStatistics(version)
case "-Ss":
case "-Ss", "-Ssq":
if op == "-Ss" {
util.SearchVerbosity = util.Detailed
} else {
util.SearchVerbosity = util.Minimal
}
for _, pkg := range pkgs {
err = yay.Search(pkg)
}
@ -95,6 +100,7 @@ func main() {
case "-Si":
err = yay.SingleSearch(pkgs, options)
case "yogurt":
util.SearchVerbosity = util.NumberMenu
for _, pkg := range pkgs {
err = yay.NumberMenu(pkg, options)
break

View file

@ -7,6 +7,7 @@ import (
"strings"
"github.com/jguer/go-alpm"
"github.com/jguer/yay/util"
)
// RepoSearch describes a Repository search.
@ -25,12 +26,6 @@ type Result struct {
// PacmanConf describes the default pacman config file
const PacmanConf string = "/etc/pacman.conf"
// NoConfirm ignores prompts.
var NoConfirm = false
// SortMode NumberMenu and Search
var SortMode = DownTop
// Determines NumberMenu and Search Order
const (
DownTop = iota
@ -90,7 +85,7 @@ func Search(pkgName string) (s RepoSearch, n int, err error) {
var installed bool
dbS := dbList.Slice()
var f int
if SortMode == DownTop {
if util.SortMode == DownTop {
f = len(dbS) - 1
} else {
f = 0
@ -100,7 +95,7 @@ func Search(pkgName string) (s RepoSearch, n int, err error) {
pkgS := dbS[f].PkgCache().Slice()
var i int
if SortMode == DownTop {
if util.SortMode == DownTop {
i = len(pkgS) - 1
} else {
i = 0
@ -125,7 +120,7 @@ func Search(pkgName string) (s RepoSearch, n int, err error) {
n++
}
if SortMode == DownTop {
if util.SortMode == DownTop {
if i > 0 {
i--
} else {
@ -140,7 +135,7 @@ func Search(pkgName string) (s RepoSearch, n int, err error) {
}
}
if SortMode == DownTop {
if util.SortMode == DownTop {
if f > 0 {
f--
} else {
@ -159,15 +154,18 @@ func Search(pkgName string) (s RepoSearch, n int, err error) {
}
//PrintSearch receives a RepoSearch type and outputs pretty text.
func (s RepoSearch) PrintSearch(mode int) {
func (s RepoSearch) PrintSearch() {
for i, res := range s {
var toprint string
if mode != -1 {
if mode == 0 {
if util.SearchVerbosity == util.NumberMenu {
if util.SortMode == util.BottomUp {
toprint += fmt.Sprintf("%d ", len(s)-i-1)
} else {
toprint += fmt.Sprintf("%d ", i)
}
} else if util.SearchVerbosity == util.Minimal {
fmt.Println(res.Name)
continue
}
toprint += fmt.Sprintf("\x1b[1m%s/\x1b[33m%s \x1b[36m%s \x1b[0m",
res.Repository, res.Name, res.Version)

View file

@ -1,6 +1,7 @@
package pacman
import "testing"
import "github.com/jguer/yay/util"
func benchmarkSearch(search string, b *testing.B) {
for n := 0; n < b.N; n++ {
@ -8,7 +9,13 @@ func benchmarkSearch(search string, b *testing.B) {
}
}
func BenchmarkSearchSimpleTopDown(b *testing.B) { SortMode = TopDown; benchmarkSearch("chromium", b) }
func BenchmarkSearchComplexTopDown(b *testing.B) { SortMode = TopDown; benchmarkSearch("linux", b) }
func BenchmarkSearchSimpleDownTop(b *testing.B) { SortMode = DownTop; benchmarkSearch("chromium", b) }
func BenchmarkSearchComplexDownTop(b *testing.B) { SortMode = DownTop; benchmarkSearch("linux", b) }
func BenchmarkSearchSimpleTopDown(b *testing.B) {
util.SortMode = TopDown
benchmarkSearch("chromium", b)
}
func BenchmarkSearchComplexTopDown(b *testing.B) { util.SortMode = TopDown; benchmarkSearch("linux", b) }
func BenchmarkSearchSimpleDownTop(b *testing.B) {
util.SortMode = DownTop
benchmarkSearch("chromium", b)
}
func BenchmarkSearchComplexDownTop(b *testing.B) { util.SortMode = DownTop; benchmarkSearch("linux", b) }

59
util/util.go Normal file
View file

@ -0,0 +1,59 @@
package util
import "fmt"
// TarBin describes the default installation point of tar command.
const TarBin string = "/usr/bin/tar"
// MakepkgBin describes the default installation point of makepkg command.
const MakepkgBin string = "/usr/bin/makepkg"
// SearchVerbosity determines print method used in PrintSearch
var SearchVerbosity = NumberMenu
// Verbosity settings for search
const (
NumberMenu = iota
Detailed
Minimal
)
// NoConfirm ignores prompts.
var NoConfirm = false
// SortMode determines top down package or down top package display
var SortMode = BottomUp
// BaseDir is the default building directory for yay
var BaseDir = "/tmp/yaytmp/"
// Describes Sorting method for numberdisplay
const (
BottomUp = iota
TopDown
)
// ContinueTask prompts if user wants to continue task.
//If NoConfirm is set the action will continue without user input.
func ContinueTask(s string, def string) (cont bool) {
if NoConfirm {
return true
}
var postFix string
if def == "nN" {
postFix = "(Y/n)"
} else {
postFix = "(y/N)"
}
var response string
fmt.Printf("\x1b[1;32m==> %s\x1b[1;37m %s\x1b[0m\n", s, postFix)
fmt.Scanln(&response)
if response == string(def[0]) || response == string(def[1]) {
return false
}
return true
}