From 29cd864bbec2d3e3175193732e0bdde85984dfec Mon Sep 17 00:00:00 2001 From: Samuel Henrique Oliveira da Silva Date: Sun, 14 Jan 2018 13:15:32 -0200 Subject: [PATCH 1/4] Support for ranges when selecting packages - Also, minor formatting to cmd.go --- cmd.go | 82 ++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 19 deletions(-) diff --git a/cmd.go b/cmd.go index 9beaa75e..677c9b0a 100644 --- a/cmd.go +++ b/cmd.go @@ -3,6 +3,7 @@ package main import ( "bufio" "encoding/json" + "errors" "fmt" "io" "os" @@ -88,7 +89,8 @@ func init() { if _, err = os.Stat(configFile); os.IsNotExist(err) { err = os.MkdirAll(filepath.Dir(configFile), 0755) if err != nil { - fmt.Println("Unable to create config directory:", filepath.Dir(configFile), err) + fmt.Println("Unable to create config directory:", + filepath.Dir(configFile), err) os.Exit(2) } // Save the default config if nothing is found @@ -102,7 +104,8 @@ func init() { decoder := json.NewDecoder(cfile) err = decoder.Decode(&config) if err != nil { - fmt.Println("Loading default Settings.\nError reading config:", err) + fmt.Println("Loading default Settings.\nError reading config:", + err) defaultSettings(&config) } } @@ -136,7 +139,7 @@ func init() { } } -func parser() (op string, options []string, packages []string, changedConfig bool, err error) { +func parser() (op string, options, packages []string, changedConfig bool, err error) { if len(os.Args) < 2 { err = fmt.Errorf("no operation specified") return @@ -306,6 +309,38 @@ func main() { } } +func buildRange(input string) (numbers []int, err error) { + multipleNums := strings.Split(input, "-") + if len(multipleNums) != 2 { + return nil, errors.New("Invalid range") + } + + rangeStart, err := strconv.Atoi(multipleNums[0]) + if err != nil { + return nil, err + } + rangeEnd, err := strconv.Atoi(multipleNums[1]) + if err != nil { + return nil, err + } + + if rangeEnd-rangeStart == 0 { + // rangeEnd == rangeStart, which means no range + return []int{rangeStart}, nil + } + if rangeEnd < rangeStart { + swap := rangeEnd + rangeEnd = rangeStart + rangeStart = swap + } + + final := make([]int, 0) + for i := rangeStart; i <= rangeEnd; i++ { + final = append(final, i) + } + return final, nil +} + // NumberMenu presents a CLI for selecting packages to install. func numberMenu(pkgS []string, flags []string) (err error) { var num int @@ -332,7 +367,8 @@ func numberMenu(pkgS []string, flags []string) (err error) { aq.printSearch(numpq + 1) } - fmt.Printf("\x1b[32m%s\x1b[0m\nNumbers: ", "Type numbers to install. Separate each number with a space.") + fmt.Printf("\x1b[32m%s\x1b[0m\nNumbers: ", + "Type numbers to install. Separate each number with a space.") reader := bufio.NewReader(os.Stdin) numberBuf, overflow, err := reader.ReadLine() if err != nil || overflow { @@ -345,25 +381,33 @@ func numberMenu(pkgS []string, flags []string) (err error) { var repoI []string result := strings.Fields(numberString) for _, numS := range result { + var numbers []int num, err = strconv.Atoi(numS) if err != nil { - continue + numbers, err = buildRange(numS) + if err != nil { + continue + } + } else { + numbers = []int{num} } // Install package - if num > numaq+numpq || num <= 0 { - continue - } else if num > numpq { - if config.SortMode == BottomUp { - aurI = append(aurI, aq[numaq+numpq-num].Name) + for _, x := range numbers { + if x > numaq+numpq || x <= 0 { + continue + } else if x > numpq { + if config.SortMode == BottomUp { + aurI = append(aurI, aq[numaq+numpq-x].Name) + } else { + aurI = append(aurI, aq[x-numpq-1].Name) + } } else { - aurI = append(aurI, aq[num-numpq-1].Name) - } - } else { - if config.SortMode == BottomUp { - repoI = append(repoI, pq[numpq-num].Name()) - } else { - repoI = append(repoI, pq[num-1].Name()) + if config.SortMode == BottomUp { + repoI = append(repoI, pq[numpq-x].Name()) + } else { + repoI = append(repoI, pq[x-1].Name()) + } } } } @@ -382,8 +426,8 @@ func numberMenu(pkgS []string, flags []string) (err error) { // Complete provides completion info for shells func complete() error { path := completionFile + config.Shell + ".cache" - - if info, err := os.Stat(path); os.IsNotExist(err) || time.Since(info.ModTime()).Hours() > 48 { + info, err := os.Stat(path) + if os.IsNotExist(err) || time.Since(info.ModTime()).Hours() > 48 { os.MkdirAll(filepath.Dir(completionFile), 0755) out, errf := os.Create(path) if errf != nil { From 6d2dcad0911de5ab53bc49e520bfc439be34b5e7 Mon Sep 17 00:00:00 2001 From: Samuel Henrique Oliveira da Silva Date: Sun, 14 Jan 2018 14:04:15 -0200 Subject: [PATCH 2/4] Replicates the range functionally to upgrade --- cmd.go | 9 +++++---- upgrade.go | 28 ++++++++++++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/cmd.go b/cmd.go index 677c9b0a..26d61bb5 100644 --- a/cmd.go +++ b/cmd.go @@ -309,7 +309,7 @@ func main() { } } -func buildRange(input string) (numbers []int, err error) { +func BuildRange(input string) (numbers []int, err error) { multipleNums := strings.Split(input, "-") if len(multipleNums) != 2 { return nil, errors.New("Invalid range") @@ -367,8 +367,9 @@ func numberMenu(pkgS []string, flags []string) (err error) { aq.printSearch(numpq + 1) } - fmt.Printf("\x1b[32m%s\x1b[0m\nNumbers: ", - "Type numbers to install. Separate each number with a space.") + fmt.Printf("\x1b[32m%s %s\x1b[0m\nNumbers: ", + "Type the numbers or ranges (e.g. 1-10) you want to install.", + "Separate each one of them with a space.") reader := bufio.NewReader(os.Stdin) numberBuf, overflow, err := reader.ReadLine() if err != nil || overflow { @@ -384,7 +385,7 @@ func numberMenu(pkgS []string, flags []string) (err error) { var numbers []int num, err = strconv.Atoi(numS) if err != nil { - numbers, err = buildRange(numS) + numbers, err = BuildRange(numS) if err != nil { continue } diff --git a/upgrade.go b/upgrade.go index bdf52edc..b9455350 100644 --- a/upgrade.go +++ b/upgrade.go @@ -279,7 +279,7 @@ func upgradePkgs(flags []string) error { if err != nil { return err } else if len(aurUp)+len(repoUp) == 0 { - fmt.Println("\nthere is nothing to do") + fmt.Println("\nThere is nothing to do") return err } @@ -302,18 +302,26 @@ func upgradePkgs(flags []string) error { result := strings.Fields(string(numberBuf)) for _, numS := range result { + var numbers []int num, err := strconv.Atoi(numS) if err != nil { - continue - } - if num > len(aurUp)+len(repoUp)-1 || num < 0 { - continue - } else if num < len(aurUp) { - num = len(aurUp) - num - 1 - aurNums = append(aurNums, num) + numbers, err = BuildRange(numS) + if err != nil { + continue + } } else { - num = len(aurUp) + len(repoUp) - num - 1 - repoNums = append(repoNums, num) + numbers = []int{num} + } + for _, target := range numbers { + if target > len(aurUp)+len(repoUp)-1 || target < 0 { + continue + } else if target < len(aurUp) { + target = len(aurUp) - target - 1 + aurNums = append(aurNums, target) + } else { + target = len(aurUp) + len(repoUp) - target - 1 + repoNums = append(repoNums, target) + } } } } From 0301eb0440bf01885761c7253147773300b70d63 Mon Sep 17 00:00:00 2001 From: Samuel Henrique Oliveira da Silva Date: Sun, 14 Jan 2018 15:48:16 -0200 Subject: [PATCH 3/4] Negation for upgrading --- cmd.go | 38 ++++++++++++++++++++++---------------- upgrade.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 18 deletions(-) diff --git a/cmd.go b/cmd.go index 26d61bb5..3b598ace 100644 --- a/cmd.go +++ b/cmd.go @@ -309,7 +309,27 @@ func main() { } } -func BuildRange(input string) (numbers []int, err error) { +// BuildIntRange build the range from start to end +func BuildIntRange(rangeStart, rangeEnd int) []int { + if rangeEnd-rangeStart == 0 { + // rangeEnd == rangeStart, which means no range + return []int{rangeStart} + } + if rangeEnd < rangeStart { + swap := rangeEnd + rangeEnd = rangeStart + rangeStart = swap + } + + final := make([]int, 0) + for i := rangeStart; i <= rangeEnd; i++ { + final = append(final, i) + } + return final +} + +// BuildRange construct a range of ints from the format 1-10 +func BuildRange(input string) ([]int, error) { multipleNums := strings.Split(input, "-") if len(multipleNums) != 2 { return nil, errors.New("Invalid range") @@ -324,21 +344,7 @@ func BuildRange(input string) (numbers []int, err error) { return nil, err } - if rangeEnd-rangeStart == 0 { - // rangeEnd == rangeStart, which means no range - return []int{rangeStart}, nil - } - if rangeEnd < rangeStart { - swap := rangeEnd - rangeEnd = rangeStart - rangeStart = swap - } - - final := make([]int, 0) - for i := rangeStart; i <= rangeEnd; i++ { - final = append(final, i) - } - return final, nil + return BuildIntRange(rangeStart, rangeEnd), err } // NumberMenu presents a CLI for selecting packages to install. diff --git a/upgrade.go b/upgrade.go index b9455350..bc9d10b4 100644 --- a/upgrade.go +++ b/upgrade.go @@ -273,6 +273,27 @@ func upRepo(local []alpm.Package) (upSlice, error) { return slice, nil } +func contains(s []int, e int) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} + +func removeListFromList(src, target []int) []int { + max := len(target) + for i := 0; i < max; i++ { + if contains(src, target[i]) { + target = append(target[:i], target[i+1:]...) + max-- + i-- + } + } + return target +} + // upgradePkgs handles updating the cache and installing updates. func upgradePkgs(flags []string) error { aurUp, repoUp, err := upList() @@ -301,7 +322,13 @@ func upgradePkgs(flags []string) error { } result := strings.Fields(string(numberBuf)) + excludeAur := make([]int, 0) + excludeRepo := make([]int, 0) for _, numS := range result { + negate := numS[0] == '^' + if negate { + numS = numS[1:] + } var numbers []int num, err := strconv.Atoi(numS) if err != nil { @@ -317,13 +344,32 @@ func upgradePkgs(flags []string) error { continue } else if target < len(aurUp) { target = len(aurUp) - target - 1 - aurNums = append(aurNums, target) + if negate { + excludeAur = append(excludeAur, target) + } else { + aurNums = append(aurNums, target) + } } else { target = len(aurUp) + len(repoUp) - target - 1 - repoNums = append(repoNums, target) + if negate { + excludeRepo = append(excludeRepo, target) + } else { + repoNums = append(repoNums, target) + } } } } + if len(repoNums) == 0 && len(aurNums) == 0 { + if len(repoUp) > 0 { + repoNums = BuildIntRange(0, len(repoUp)-1) + } + if len(aurUp) > 0 { + aurNums = BuildIntRange(0, len(aurUp)-1) + } + } + aurNums = removeListFromList(excludeAur, aurNums) + repoNums = removeListFromList(excludeRepo, repoNums) + fmt.Println(repoNums, aurNums, excludeAur, excludeRepo) } if len(repoUp) != 0 { From d737c99c81b38d69480d06bffee90261ae9db3d8 Mon Sep 17 00:00:00 2001 From: Samuel Henrique Oliveira da Silva Date: Sun, 14 Jan 2018 16:53:37 -0200 Subject: [PATCH 4/4] Excluding from installation #ItWoksOnMyMachine --- cmd.go | 77 +++++++++++++++++++++++++++++++++++++++++++++--------- upgrade.go | 16 +++++++----- 2 files changed, 73 insertions(+), 20 deletions(-) diff --git a/cmd.go b/cmd.go index 3b598ace..8f6990ca 100644 --- a/cmd.go +++ b/cmd.go @@ -347,16 +347,39 @@ func BuildRange(input string) ([]int, error) { return BuildIntRange(rangeStart, rangeEnd), err } +// Contains returns wheter e is present in s +func contains(s []string, e string) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} + +// RemoveIntListFromList removes all src's elements that are present in target +func removeListFromList(src, target []string) []string { + max := len(target) + for i := 0; i < max; i++ { + if contains(src, target[i]) { + target = append(target[:i], target[i+1:]...) + max-- + i-- + } + } + return target +} + // NumberMenu presents a CLI for selecting packages to install. func numberMenu(pkgS []string, flags []string) (err error) { var num int - aq, err := narrowSearch(pkgS, true) + aurQ, err := narrowSearch(pkgS, true) if err != nil { fmt.Println("Error during AUR search:", err) } - numaq := len(aq) - pq, numpq, err := queryRepo(pkgS) + numaq := len(aurQ) + repoQ, numpq, err := queryRepo(pkgS) if err != nil { return } @@ -366,11 +389,11 @@ func numberMenu(pkgS []string, flags []string) (err error) { } if config.SortMode == BottomUp { - aq.printSearch(numpq + 1) - pq.printSearch() + aurQ.printSearch(numpq + 1) + repoQ.printSearch() } else { - pq.printSearch() - aq.printSearch(numpq + 1) + repoQ.printSearch() + aurQ.printSearch(numpq + 1) } fmt.Printf("\x1b[32m%s %s\x1b[0m\nNumbers: ", @@ -384,10 +407,13 @@ func numberMenu(pkgS []string, flags []string) (err error) { } numberString := string(numberBuf) - var aurI []string - var repoI []string + var aurI, aurNI, repoNI, repoI []string result := strings.Fields(numberString) for _, numS := range result { + negate := numS[0] == '^' + if negate { + numS = numS[1:] + } var numbers []int num, err = strconv.Atoi(numS) if err != nil { @@ -401,24 +427,49 @@ func numberMenu(pkgS []string, flags []string) (err error) { // Install package for _, x := range numbers { + var target string if x > numaq+numpq || x <= 0 { continue } else if x > numpq { if config.SortMode == BottomUp { - aurI = append(aurI, aq[numaq+numpq-x].Name) + target = aurQ[numaq+numpq-x].Name } else { - aurI = append(aurI, aq[x-numpq-1].Name) + target = aurQ[x-numpq-1].Name + } + if negate { + aurNI = append(aurNI, target) + } else { + aurI = append(aurI, target) } } else { if config.SortMode == BottomUp { - repoI = append(repoI, pq[numpq-x].Name()) + target = repoQ[numpq-x].Name() } else { - repoI = append(repoI, pq[x-1].Name()) + target = repoQ[x-1].Name() + } + if negate { + repoNI = append(repoNI, target) + } else { + repoI = append(repoI, target) } } } } + if len(repoI) == 0 && len(aurI) == 0 && + (len(aurNI) > 0 || len(repoNI) > 0) { + // If no package was specified, only exclusions, exclude from all the + // packages + for _, pack := range aurQ { + aurI = append(aurI, pack.Name) + } + for _, pack := range repoQ { + repoI = append(repoI, pack.Name()) + } + } + aurI = removeListFromList(aurNI, aurI) + repoI = removeListFromList(repoNI, repoI) + if len(repoI) != 0 { err = passToPacman("-S", repoI, flags) } diff --git a/upgrade.go b/upgrade.go index bc9d10b4..d13d0ee1 100644 --- a/upgrade.go +++ b/upgrade.go @@ -273,7 +273,8 @@ func upRepo(local []alpm.Package) (upSlice, error) { return slice, nil } -func contains(s []int, e int) bool { +//Contains returns wheter e is present in s +func containsInt(s []int, e int) bool { for _, a := range s { if a == e { return true @@ -282,10 +283,11 @@ func contains(s []int, e int) bool { return false } -func removeListFromList(src, target []int) []int { +// RemoveIntListFromList removes all src's elements that are present in target +func removeIntListFromList(src, target []int) []int { max := len(target) for i := 0; i < max; i++ { - if contains(src, target[i]) { + if containsInt(src, target[i]) { target = append(target[:i], target[i+1:]...) max-- i-- @@ -359,7 +361,8 @@ func upgradePkgs(flags []string) error { } } } - if len(repoNums) == 0 && len(aurNums) == 0 { + if len(repoNums) == 0 && len(aurNums) == 0 && + (len(excludeRepo) > 0 || len(excludeAur) > 0) { if len(repoUp) > 0 { repoNums = BuildIntRange(0, len(repoUp)-1) } @@ -367,9 +370,8 @@ func upgradePkgs(flags []string) error { aurNums = BuildIntRange(0, len(aurUp)-1) } } - aurNums = removeListFromList(excludeAur, aurNums) - repoNums = removeListFromList(excludeRepo, repoNums) - fmt.Println(repoNums, aurNums, excludeAur, excludeRepo) + aurNums = removeIntListFromList(excludeAur, aurNums) + repoNums = removeIntListFromList(excludeRepo, repoNums) } if len(repoUp) != 0 {