diff --git a/cmd.go b/cmd.go index 73161d5b..35710b26 100644 --- a/cmd.go +++ b/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": diff --git a/config.go b/config.go index 237ff740..0708b53a 100644 --- a/config.go +++ b/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) diff --git a/install.go b/install.go index f77d1690..dbc1d41d 100644 --- a/install.go +++ b/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 diff --git a/parser.go b/parser.go index 134786fe..56d61fc7 100644 --- a/parser.go +++ b/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 } diff --git a/query.go b/query.go index 8fcb2e82..46b624df 100644 --- a/query.go +++ b/query.go @@ -21,10 +21,32 @@ func (q aurQuery) Len() int { } func (q aurQuery) Less(i, j int) bool { - if config.SortMode == BottomUp { - return q[i].NumVotes < q[j].NumVotes + 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 } - return q[i].NumVotes > q[j].NumVotes + + if config.SortMode == BottomUp { + return !result + } + + return result } func (q aurQuery) Swap(i, j int) { diff --git a/upgrade.go b/upgrade.go index 1556cdb2..15c2817b 100644 --- a/upgrade.go +++ b/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