Browse Source

Use parseNumberMenu() for yogurt mode

morganamilo 7 years atrás
parent
commit
287bac04c9
1 changed files with 33 additions and 64 deletions
  1. 33 64
      cmd.go

+ 33 - 64
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