浏览代码

Add flags for sort order and automating menu input

Added:

--sortby <votes|popularity|id|baseid|name|base|submitted|modified>
--answerclean
--answeredit
--answerupgrade
--noanswerclean
--noansweredit
--noanswerupgrade

TODO: docs and completion
morganamilo 7 年之前
父节点
当前提交
8556acdd5f
共有 6 个文件被更改,包括 80 次插入30 次删除
  1. 15 1
      cmd.go
  2. 29 0
      config.go
  3. 2 18
      install.go
  4. 8 0
      parser.go
  5. 24 2
      query.go
  6. 2 9
      upgrade.go

+ 15 - 1
cmd.go

@@ -125,7 +125,7 @@ func handleCmd() (err error) {
 	if shouldSaveConfig {
 		config.saveConfig()
 	}
-	
+
 	if cmdArgs.existsArg("h", "help") {
 		err = handleHelp()
 		return
@@ -214,6 +214,8 @@ func handleConfig(option, value string) bool {
 		config.SortMode = TopDown
 	case "bottomup":
 		config.SortMode = BottomUp
+	case "sortby":
+		config.SortBy = value
 	case "noconfirm":
 		config.NoConfirm = true
 	case "redownload":
@@ -230,6 +232,18 @@ func handleConfig(option, value string) bool {
 		config.ReBuild = "tree"
 	case "norebuild":
 		config.ReBuild = "no"
+	case "answerclean":
+		config.AnswerClean = value
+	case "noanswerclean":
+		config.AnswerClean = ""
+	case "answeredit":
+		config.AnswerEdit = value
+	case "noansweredit":
+		config.AnswerEdit = ""
+	case "answerupgrade":
+		config.AnswerUpgrade = value
+	case "noanswerupgrade":
+		config.AnswerUpgrade = ""
 	case "gpgflags":
 		config.GpgFlags = value
 	case "mflags":

+ 29 - 0
config.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"bufio"
 	"bytes"
 	"encoding/json"
 	"fmt"
@@ -33,10 +34,14 @@ type Configuration struct {
 	TarBin        string `json:"tarbin"`
 	ReDownload    string `json:"redownload"`
 	ReBuild       string `json:"rebuild"`
+	AnswerClean   string `json:"answerclean"`
+	AnswerEdit    string `json:"answeredit"`
+	AnswerUpgrade string `json:"answerupgrade"`
 	GitBin        string `json:"gitbin"`
 	GpgBin        string `json:"gpgbin"`
 	GpgFlags      string `json:"gpgflags"`
 	MFlags        string `json:"mflags"`
+	SortBy        string `json:"sortby"`
 	RequestSplitN int    `json:"requestsplitn"`
 	SearchMode    int    `json:"-"`
 	SortMode      int    `json:"sortmode"`
@@ -134,6 +139,7 @@ func defaultSettings(config *Configuration) {
 	config.GpgFlags = ""
 	config.MFlags = ""
 	config.SortMode = BottomUp
+	config.SortBy = "votes"
 	config.SudoLoop = false
 	config.TarBin = "bsdtar"
 	config.GitBin = "git"
@@ -142,6 +148,9 @@ func defaultSettings(config *Configuration) {
 	config.RequestSplitN = 150
 	config.ReDownload = "no"
 	config.ReBuild = "no"
+	config.AnswerClean = ""
+	config.AnswerEdit = ""
+	config.AnswerUpgrade = ""
 }
 
 // Editor returns the preferred system editor.
@@ -223,6 +232,26 @@ func continueTask(s string, def string) (cont bool) {
 	return true
 }
 
+func getInput(defaultValue string) (string, error) {
+	if defaultValue != "" {
+		fmt.Println(defaultValue)
+		return defaultValue, nil
+	}
+
+	reader := bufio.NewReader(os.Stdin)
+
+	buf, overflow, err := reader.ReadLine()
+	if err != nil {
+		return "", err
+	}
+
+	if overflow {
+		return "", fmt.Errorf("Input too long")
+	}
+
+	return string(buf), nil
+}
+
 func (config Configuration) String() string {
 	var buf bytes.Buffer
 	enc := json.NewEncoder(&buf)

+ 2 - 18
install.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"bufio"
 	"fmt"
 	"os"
 	"os/exec"
@@ -337,19 +336,11 @@ func cleanEditNumberMenu(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg, installed
 		fmt.Println(bold(green(arrow + " Packages to cleanBuild?")))
 		fmt.Println(bold(green(arrow) + cyan(" [N]one ") + green("[A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)")))
 		fmt.Print(bold(green(arrow + " ")))
-		reader := bufio.NewReader(os.Stdin)
-
-		numberBuf, overflow, err := reader.ReadLine()
+		cleanInput, err := getInput(config.AnswerClean)
 		if err != nil {
 			return nil, nil, err
 		}
 
-		if overflow {
-			return nil, nil, fmt.Errorf("Input too long")
-		}
-
-		cleanInput := string(numberBuf)
-
 		cInclude, cExclude, cOtherInclude, cOtherExclude := parseNumberMenu(cleanInput)
 		cIsInclude := len(cExclude) == 0 && len(cOtherExclude) == 0
 
@@ -398,19 +389,12 @@ func cleanEditNumberMenu(pkgs []*rpc.Pkg, bases map[string][]*rpc.Pkg, installed
 	fmt.Println(bold(green(arrow) + cyan(" [N]one ") + green("[A]ll [Ab]ort [I]nstalled [No]tInstalled or (1 2 3, 1-3, ^4)")))
 
 	fmt.Print(bold(green(arrow + " ")))
-	reader := bufio.NewReader(os.Stdin)
 
-	numberBuf, overflow, err := reader.ReadLine()
+	editInput, err := getInput(config.AnswerEdit)
 	if err != nil {
 		return nil, nil, err
 	}
 
-	if overflow {
-		return nil, nil, fmt.Errorf("Input too long")
-	}
-
-	editInput := string(numberBuf)
-
 	eInclude, eExclude, eOtherInclude, eOtherExclude := parseNumberMenu(editInput)
 	eIsInclude := len(eExclude) == 0 && len(eOtherExclude) == 0
 

+ 8 - 0
parser.go

@@ -445,6 +445,14 @@ func hasParam(arg string) bool {
 		return true
 	case "requestsplitn":
 		return true
+	case "answerclean":
+		return true
+	case "answeredit":
+		return true
+	case "answerupgrade":
+		return true
+	case "sortby":
+		return true
 	default:
 		return false
 	}

+ 24 - 2
query.go

@@ -21,10 +21,32 @@ func (q aurQuery) Len() int {
 }
 
 func (q aurQuery) Less(i, j int) bool {
+	var result bool
+
+	switch config.SortBy {
+	case "votes":
+		result = q[i].NumVotes > q[j].NumVotes
+	case "popularity":
+		result = q[i].Popularity > q[j].Popularity
+	case "name":
+		result = lessRunes([]rune(q[i].Name), []rune(q[j].Name))
+	case "base":
+		result = lessRunes([]rune(q[i].PackageBase), []rune(q[j].PackageBase))
+	case "submitted":
+		result = q[i].FirstSubmitted < q[j].FirstSubmitted
+	case "modified":
+		result = q[i].LastModified < q[j].LastModified
+	case "id":
+		result = q[i].ID < q[j].ID
+	case "baseid":
+		result = q[i].PackageBaseID < q[j].PackageBaseID
+	}
+
 	if config.SortMode == BottomUp {
-		return q[i].NumVotes < q[j].NumVotes
+		return !result
 	}
-	return q[i].NumVotes > q[j].NumVotes
+
+	return result
 }
 
 func (q aurQuery) Swap(i, j int) {

+ 2 - 9
upgrade.go

@@ -1,9 +1,7 @@
 package main
 
 import (
-	"bufio"
 	"fmt"
-	"os"
 	"sort"
 	"strings"
 	"sync"
@@ -288,21 +286,16 @@ func upgradePkgs(aurUp, repoUp upSlice) (stringSet, stringSet, error) {
 
 	fmt.Println(bold(green(arrow + " Packages to not upgrade (eg: 1 2 3, 1-3, ^4 or repo name)")))
 	fmt.Print(bold(green(arrow + " ")))
-	reader := bufio.NewReader(os.Stdin)
 
-	numberBuf, overflow, err := reader.ReadLine()
+	numbers, err := getInput(config.AnswerUpgrade)
 	if err != nil {
 		return nil, nil, err
 	}
 
-	if overflow {
-		return nil, nil, fmt.Errorf("Input too long")
-	}
-
 	//upgrade menu asks you which packages to NOT upgrade so in this case
 	//include and exclude are kind of swaped
 	//include, exclude, other := parseNumberMenu(string(numberBuf))
-	include, exclude, otherInclude, otherExclude := parseNumberMenu(string(numberBuf))
+	include, exclude, otherInclude, otherExclude := parseNumberMenu(numbers)
 
 	isInclude := len(exclude) == 0 && len(otherExclude) == 0