diff --git a/cmd.go b/cmd.go index ef963863..ab9132fd 100644 --- a/cmd.go +++ b/cmd.go @@ -588,9 +588,6 @@ func removeListFromList(src, target []string) []string { // NumberMenu presents a CLI for selecting packages to install. func numberMenu(pkgS []string, flags []string) (err error) { - //func numberMenu(cmdArgs *arguments) (err error) { - var num int - aurQ, err := narrowSearch(pkgS, true) if err != nil { fmt.Println("Error during AUR search:", err) @@ -615,83 +612,55 @@ func numberMenu(pkgS []string, flags []string) (err error) { fmt.Println(bold(green(arrow + " Packages to install (eg: 1 2 3, 1-3 or ^4)"))) fmt.Print(bold(green(arrow + " "))) + reader := bufio.NewReader(os.Stdin) numberBuf, overflow, err := reader.ReadLine() - if err != nil || overflow { - fmt.Println(err) - return + + if err != nil { + return err } - numberString := string(numberBuf) - 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 { - numbers, err = BuildRange(numS) - if err != nil { - continue - } - } else { - numbers = []int{num} + if overflow { + return fmt.Errorf("Input too long") + } + + include, exclude, _, otherExclude := parseNumberMenu(string(numberBuf)) + arguments := makeArguments() + + isInclude := len(exclude) == 0 && len(otherExclude) == 0 + + for i, pkg := range repoQ { + target := len(repoQ) - i + if config.SortMode == TopDown { + target = i + 1 } - // Install package - for _, x := range numbers { - var target string - if x > numaq+numpq || x <= 0 { - continue - } else if x > numpq { - if config.SortMode == BottomUp { - target = aurQ[numaq+numpq-x].Name - } else { - target = aurQ[x-numpq-1].Name - } - if negate { - aurNI = append(aurNI, target) - } else { - aurI = append(aurI, target) - } - } else { - if config.SortMode == BottomUp { - target = repoQ[numpq-x].Name() - } else { - target = repoQ[x-1].Name() - } - if negate { - repoNI = append(repoNI, target) - } else { - repoI = append(repoI, target) - } - } + if isInclude && include.get(target) { + arguments.addTarget(pkg.Name()) + } + if !isInclude && !exclude.get(target) { + arguments.addTarget(pkg.Name()) } } - 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 i, pkg := range aurQ { + target := len(aurQ) - i + len(repoQ) + if config.SortMode == TopDown { + target = i + 1 + len(repoQ) + } + + if isInclude && include.get(target) { + arguments.addTarget(pkg.Name) } - for _, pack := range repoQ { - repoI = append(repoI, pack.Name()) + if !isInclude && !exclude.get(target) { + arguments.addTarget(pkg.Name) } } - aurI = removeListFromList(aurNI, aurI) - repoI = removeListFromList(repoNI, repoI) if config.SudoLoop { sudoLoopBackground() } - arguments := makeArguments() - arguments.addTarget(repoI...) - arguments.addTarget(aurI...) + err = install(arguments) return err