Browse Source

Try each search term against RPC if one fails

Allows searching the RPC for words that may be too short or have
too many results as long as another word in the search will work.

If no words can be used without error then the last error will be
returned and the program will exit.
morganamilo 7 years ago
parent
commit
fe3743c5ba
2 changed files with 18 additions and 3 deletions
  1. 1 1
      cmd.go
  2. 17 2
      query.go

+ 1 - 1
cmd.go

@@ -362,7 +362,7 @@ func handleRemove() (err error) {
 func numberMenu(pkgS []string, flags []string) (err error) {
 func numberMenu(pkgS []string, flags []string) (err error) {
 	aurQ, err := narrowSearch(pkgS, true)
 	aurQ, err := narrowSearch(pkgS, true)
 	if err != nil {
 	if err != nil {
-		fmt.Println("Error during AUR search:", err)
+		return fmt.Errorf("Error during AUR search: %s", err)
 	}
 	}
 	numaq := len(aurQ)
 	numaq := len(aurQ)
 	repoQ, numpq, err := queryRepo(pkgS)
 	repoQ, numpq, err := queryRepo(pkgS)

+ 17 - 2
query.go

@@ -72,11 +72,22 @@ func filterPackages() (local []alpm.Package, remote []alpm.Package,
 
 
 // NarrowSearch searches AUR and narrows based on subarguments
 // NarrowSearch searches AUR and narrows based on subarguments
 func narrowSearch(pkgS []string, sortS bool) (aurQuery, error) {
 func narrowSearch(pkgS []string, sortS bool) (aurQuery, error) {
+	var r []rpc.Pkg
+	var err error
+	var usedIndex int
+
 	if len(pkgS) == 0 {
 	if len(pkgS) == 0 {
 		return nil, nil
 		return nil, nil
 	}
 	}
 
 
-	r, err := rpc.Search(pkgS[0])
+	for i, word := range pkgS {
+		r, err = rpc.Search(word)
+		if err == nil {
+			usedIndex = i
+			break
+		}
+	}
+
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
@@ -93,7 +104,11 @@ func narrowSearch(pkgS []string, sortS bool) (aurQuery, error) {
 
 
 	for _, res := range r {
 	for _, res := range r {
 		match := true
 		match := true
-		for _, pkgN := range pkgS[1:] {
+		for i, pkgN := range pkgS {
+			if usedIndex == i {
+				continue
+			}
+
 			if !(strings.Contains(res.Name, pkgN) || strings.Contains(strings.ToLower(res.Description), pkgN)) {
 			if !(strings.Contains(res.Name, pkgN) || strings.Contains(strings.ToLower(res.Description), pkgN)) {
 				match = false
 				match = false
 				break
 				break