Resolves #3 (again). Filtering is now faster and happens in AUR and Pacman

This commit is contained in:
Jguer 2017-02-18 15:29:40 +00:00
parent 14b46a7461
commit 1ebe472123
7 changed files with 62 additions and 81 deletions

View file

@ -26,6 +26,9 @@ Yay was created with a few objectives in mind and based on the design of yaourt
### Changelog ### Changelog
#### 1.101
- Search speed and quality improved [#3](https://github.com/Jguer/yay/issues/3)
#### 1.100 #### 1.100
- Added manpage - Added manpage
- Improved search [#3](https://github.com/Jguer/yay/issues/3) - Improved search [#3](https://github.com/Jguer/yay/issues/3)

View file

@ -14,50 +14,15 @@ import (
"github.com/jguer/yay/util" "github.com/jguer/yay/util"
) )
// NarrowSearch removes terms that don't contain narrow terms in the description or name.
func narrowSearch(aq aur.Query, pq pac.Query, narrow []string) (raq aur.Query, rpq pac.Query) {
for _, pr := range pq {
match := false
for _, narrowS := range narrow {
if strings.Contains(strings.ToUpper(pr.Name), strings.ToUpper(narrowS)) || strings.Contains(strings.ToUpper(pr.Description), strings.ToUpper(narrowS)) {
match = true
} else {
match = false
}
}
if match {
rpq = append(rpq, pr)
}
}
for _, ar := range aq {
match := false
for _, narrowS := range narrow {
if strings.Contains(strings.ToUpper(ar.Name), strings.ToUpper(narrowS)) || strings.Contains(strings.ToUpper(ar.Description), strings.ToUpper(narrowS)) {
match = true
} else {
match = false
}
}
if match {
raq = append(raq, ar)
}
}
return
}
// NumberMenu presents a CLI for selecting packages to install. // NumberMenu presents a CLI for selecting packages to install.
func NumberMenu(pkgName string, narrow []string, flags []string) (err error) { func NumberMenu(pkgS []string, flags []string) (err error) {
var num int var num int
aq, numaq, err := aur.Search(pkgName, true) aq, numaq, err := aur.Search(pkgS, true)
if err != nil { if err != nil {
fmt.Println("Error during AUR search:", err) fmt.Println("Error during AUR search:", err)
} }
pq, numpq, err := pac.Search(pkgName) pq, numpq, err := pac.Search(pkgS)
if err != nil { if err != nil {
return return
} }
@ -66,12 +31,6 @@ func NumberMenu(pkgName string, narrow []string, flags []string) (err error) {
return fmt.Errorf("no packages match search") return fmt.Errorf("no packages match search")
} }
if len(narrow) != 0 {
aq, pq = narrowSearch(aq, pq, narrow)
numaq = len(aq)
numpq = len(pq)
}
if util.SortMode == util.BottomUp { if util.SortMode == util.BottomUp {
aq.PrintSearch(numpq) aq.PrintSearch(numpq)
pq.PrintSearch() pq.PrintSearch()
@ -188,21 +147,17 @@ func Upgrade(flags []string) error {
return erra return erra
} }
// Search presents a query to the local repos and to the AUR. // SyncSearch presents a query to the local repos and to the AUR.
func Search(pkg string, narrow []string) (err error) { func SyncSearch(pkgS []string) (err error) {
aq, _, err := aur.Search(pkg, true) aq, _, err := aur.Search(pkgS, true)
if err != nil { if err != nil {
return err return err
} }
pq, _, err := pac.Search(pkg) pq, _, err := pac.Search(pkgS)
if err != nil { if err != nil {
return err return err
} }
if len(narrow) != 0 {
aq, pq = narrowSearch(aq, pq, narrow)
}
if util.SortMode == util.BottomUp { if util.SortMode == util.BottomUp {
aq.PrintSearch(0) aq.PrintSearch(0)
pq.PrintSearch() pq.PrintSearch()
@ -214,8 +169,8 @@ func Search(pkg string, narrow []string) (err error) {
return nil return nil
} }
// SingleSearch serves as a pacman -Si for repo packages and AUR packages. // SyncInfo serves as a pacman -Si for repo packages and AUR packages.
func SingleSearch(pkgS []string, flags []string) (err error) { func SyncInfo(pkgS []string, flags []string) (err error) {
aurS, repoS, err := pac.PackageSlices(pkgS) aurS, repoS, err := pac.PackageSlices(pkgS)
if err != nil { if err != nil {
return return

View file

@ -9,7 +9,7 @@ import (
func TestSearch(t *testing.T) { func TestSearch(t *testing.T) {
eN := "yay" eN := "yay"
result, _, err := Search("yay", true) result, _, err := Search([]string{"yay"}, true)
if err != nil { if err != nil {
t.Fatalf("Expected err to be nil but it was %s", err) t.Fatalf("Expected err to be nil but it was %s", err)
} }
@ -30,7 +30,7 @@ func TestSearch(t *testing.T) {
func benchmarkSearch(search string, sort bool, b *testing.B) { func benchmarkSearch(search string, sort bool, b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
Search(search, sort) Search([]string{search}, sort)
} }
} }

View file

@ -3,6 +3,7 @@ package aur
import ( import (
"fmt" "fmt"
"sort" "sort"
"strings"
"github.com/jguer/yay/pacman" "github.com/jguer/yay/pacman"
"github.com/jguer/yay/util" "github.com/jguer/yay/util"
@ -91,27 +92,45 @@ func MultiInfo(pkgS []string) (Query, int, error) {
} }
// Search returns an AUR search // Search returns an AUR search
func Search(pkg string, sortS bool) (Query, int, error) { func Search(pkgS []string, sortS bool) (Query, int, error) {
type returned struct { type returned struct {
Results Query `json:"results"` Results Query `json:"results"`
ResultCount int `json:"resultcount"` ResultCount int `json:"resultcount"`
} }
r := returned{} r := returned{}
err := getJSON("https://aur.archlinux.org/rpc/?v=5&type=search&arg="+pkg, &r) err := getJSON("https://aur.archlinux.org/rpc/?v=5&type=search&arg="+pkgS[0], &r)
var aq Query
n := 0
setter := pacman.PFactory(pFSetTrue)
var fri int
for _, res := range r.Results {
match := true
for _, pkgN := range pkgS[1:] {
if !(strings.Contains(res.Name, pkgN) || strings.Contains(strings.ToLower(res.Description), pkgN)) {
match = false
break
}
}
if match {
n++
aq = append(aq, res)
fri = len(aq) - 1
setter(aq[fri].Name, &aq[fri], false)
}
}
if aq != nil {
setter(aq[fri].Name, &aq[fri], true)
}
if sortS { if sortS {
sort.Sort(r.Results) sort.Sort(aq)
} }
setter := pacman.PFactory(pFSetTrue)
for i, res := range r.Results { return aq, n, err
if i == len(r.Results)-1 {
setter(res.Name, &r.Results[i], true)
continue
}
setter(res.Name, &r.Results[i], false)
}
return r.Results, r.ResultCount, err
} }
// This is very dirty but it works so good. // This is very dirty but it works so good.

View file

@ -105,20 +105,17 @@ func main() {
} }
if pkgs != nil { if pkgs != nil {
err = yay.Search(pkgs[0], pkgs[1:]) err = yay.SyncSearch(pkgs)
} }
case "-S": case "-S":
err = yay.Install(pkgs, options) err = yay.Install(pkgs, options)
case "-Syu", "-Suy": case "-Syu", "-Suy":
err = yay.Upgrade(options) err = yay.Upgrade(options)
case "-Si": case "-Si":
err = yay.SingleSearch(pkgs, options) err = yay.SyncInfo(pkgs, options)
case "yogurt": case "yogurt":
util.SearchVerbosity = util.NumberMenu util.SearchVerbosity = util.NumberMenu
err = yay.NumberMenu(pkgs, options)
if pkgs != nil {
err = yay.NumberMenu(pkgs[0], pkgs[1:], options)
}
default: default:
err = yay.PassToPacman(op, pkgs, options) err = yay.PassToPacman(op, pkgs, options)
} }

View file

@ -55,7 +55,7 @@ func UpdatePackages(flags []string) error {
} }
// Search handles repo searches. Creates a RepoSearch struct. // Search handles repo searches. Creates a RepoSearch struct.
func Search(pkgName string) (s Query, n int, err error) { func Search(pkgInputN []string) (s Query, n int, err error) {
h, err := conf.CreateHandle() h, err := conf.CreateHandle()
defer h.Release() defer h.Release()
if err != nil { if err != nil {
@ -108,12 +108,20 @@ func Search(pkgName string) (s Query, n int, err error) {
for i := initL(lenPkgs); compL(lenPkgs, i); i = finalL(i) { for i := initL(lenPkgs); compL(lenPkgs, i); i = finalL(i) {
if strings.Contains(pkgS[i].Name(), pkgName) || strings.Contains(strings.ToLower(pkgS[i].Description()), pkgName) { match := true
for _, pkgN := range pkgInputN {
if !(strings.Contains(pkgS[i].Name(), pkgN) || strings.Contains(strings.ToLower(pkgS[i].Description()), pkgN)) {
match = false
break
}
}
if match {
installed = false
if r, _ := localDb.PkgByName(pkgS[i].Name()); r != nil { if r, _ := localDb.PkgByName(pkgS[i].Name()); r != nil {
installed = true installed = true
} else {
installed = false
} }
n++
s = append(s, Result{ s = append(s, Result{
Name: pkgS[i].Name(), Name: pkgS[i].Name(),
@ -123,7 +131,6 @@ func Search(pkgName string) (s Query, n int, err error) {
Group: strings.Join(pkgS[i].Groups().Slice(), ","), Group: strings.Join(pkgS[i].Groups().Slice(), ","),
Installed: installed, Installed: installed,
}) })
n++
} }
} }
} }

View file

@ -10,7 +10,7 @@ func benchmarkPrintSearch(search string, b *testing.B) {
os.Stdout = w os.Stdout = w
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
res, _, _ := Search(search) res, _, _ := Search(append([]string{}, search))
res.PrintSearch() res.PrintSearch()
} }
os.Stdout = old os.Stdout = old
@ -36,7 +36,7 @@ func BenchmarkPrintSearchComplexBottomUp(b *testing.B) {
func benchmarkSearch(search string, b *testing.B) { func benchmarkSearch(search string, b *testing.B) {
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
Search(search) Search(append([]string{}, search))
} }
} }
func BenchmarkSearchSimpleTopDown(b *testing.B) { func BenchmarkSearchSimpleTopDown(b *testing.B) {