瀏覽代碼

Merge pull request #449 from Morganamilo/fix#448

 Support db prefix and --repo/--aur on -G
Anna 7 年之前
父節點
當前提交
33f067fe9e
共有 4 個文件被更改,包括 86 次插入28 次删除
  1. 3 6
      depPool.go
  2. 50 15
      download.go
  3. 10 7
      query.go
  4. 23 0
      utils.go

+ 3 - 6
depPool.go

@@ -84,6 +84,8 @@ func (dp *depPool) ResolveTargets(pkgs []string) error {
 	// call
 	aurTargets := make(stringSet)
 
+	pkgs = removeInvalidTargets(pkgs)
+
 	for _, pkg := range pkgs {
 		var err error
 		target := toTarget(pkg)
@@ -101,17 +103,12 @@ func (dp *depPool) ResolveTargets(pkgs []string) error {
 		var singleDb *alpm.Db
 
 		// aur/ prefix means we only check the aur
-		if target.Db == "aur" || (target.Db == "" && mode == ModeAUR) {
+		if target.Db == "aur" || mode == ModeAUR {
 			dp.Targets = append(dp.Targets, target)
 			aurTargets.set(target.DepString())
 			continue
 		}
 
-		if mode == ModeAUR {
-			dp.Targets = append(dp.Targets, target)
-			continue
-		}
-
 		// if theres a different priefix only look in that repo
 		if target.Db != "" {
 			singleDb, err = alpmHandle.SyncDbByName(target.Db)

+ 50 - 15
download.go

@@ -100,23 +100,40 @@ func downloadAndUnpack(url string, path string) (err error) {
 }
 
 func getPkgbuilds(pkgs []string) error {
-	//possibleAurs := make([]string, 0, 0)
+	missing := false
 	wd, err := os.Getwd()
 	if err != nil {
 		return err
 	}
 
-	missing, err := getPkgbuildsfromABS(pkgs, wd)
-	if err != nil {
-		return err
+	pkgs = removeInvalidTargets(pkgs)
+
+	aur, repo, err := packageSlices(pkgs)
+
+	if len(repo) > 0 {
+		missing, err = getPkgbuildsfromABS(repo, wd)
+		if err != nil {
+			return err
+		}
+	}
+
+	if len(aur) > 0 {
+		_missing, err := getPkgbuildsfromAUR(aur, wd)
+		if err != nil {
+			return err
+		}
+		missing = missing || _missing
+	}
+
+	if missing {
+		err = fmt.Errorf("")
 	}
 
-	err = getPkgbuildsfromAUR(missing, wd)
 	return err
 }
 
 // GetPkgbuild downloads pkgbuild from the ABS.
-func getPkgbuildsfromABS(pkgs []string, path string) (missing []string, err error) {
+func getPkgbuildsfromABS(pkgs []string, path string) (missing bool,err error) {
 	dbList, err := alpmHandle.SyncDbs()
 	if err != nil {
 		return
@@ -124,8 +141,14 @@ func getPkgbuildsfromABS(pkgs []string, path string) (missing []string, err erro
 
 nextPkg:
 	for _, pkgN := range pkgs {
+		pkgDb, name := splitDbFromName(pkgN)
+
 		for _, db := range dbList.Slice() {
-			pkg, err := db.PkgByName(pkgN)
+			if pkgDb != "" && db.Name() != pkgDb {
+				continue
+			}
+
+			pkg, err := db.PkgByName(name)
 			if err == nil {
 				var url string
 				name := pkg.Base()
@@ -144,7 +167,7 @@ nextPkg:
 				case "community", "multilib":
 					url = "https://git.archlinux.org/svntogit/community.git/snapshot/packages/" + name + ".tar.gz"
 				default:
-					fmt.Println(name + " not in standard repositories")
+					fmt.Println(pkgN, "not in standard repositories")
 					continue nextPkg
 				}
 
@@ -164,7 +187,8 @@ nextPkg:
 			}
 		}
 
-		missing = append(missing, pkgN)
+		fmt.Println(pkgN, "could not find package in database")
+		missing = true
 	}
 
 	if _, err := os.Stat(filepath.Join(cacheHome, "packages")); err == nil {
@@ -175,14 +199,25 @@ nextPkg:
 }
 
 // GetPkgbuild downloads pkgbuild from the AUR.
-func getPkgbuildsfromAUR(pkgs []string, dir string) (err error) {
-	aq, err := aurInfoPrint(pkgs)
+func getPkgbuildsfromAUR(pkgs []string, dir string) (bool, error) {
+	missing := false
+	strippedPkgs := make([]string, 0)
+	for _, pkg := range pkgs {
+		_, name := splitDbFromName(pkg)
+		strippedPkgs = append(strippedPkgs, name)
+	}
+
+	aq, err := aurInfoPrint(strippedPkgs)
 	if err != nil {
-		return err
+		return missing, err
 	}
 
 	for _, pkg := range aq {
-		var err error
+		if _, err := os.Stat(filepath.Join(dir, pkg.PackageBase)); err == nil {
+			fmt.Println(bold(red(arrow)), bold(cyan(pkg.Name)), "directory already exists")
+			continue
+		}
+
 		if shouldUseGit(filepath.Join(dir, pkg.PackageBase)) {
 			err = gitDownload(baseURL+"/"+pkg.PackageBase+".git", dir, pkg.PackageBase)
 		} else {
@@ -197,8 +232,8 @@ func getPkgbuildsfromAUR(pkgs []string, dir string) (err error) {
 	}
 
 	if len(aq) != len(pkgs) {
-		return fmt.Errorf("Could not find all required packages")
+		missing = true
 	}
 
-	return
+	return missing, err
 }

+ 10 - 7
query.go

@@ -184,6 +184,8 @@ func syncSearch(pkgS []string) (err error) {
 // SyncInfo serves as a pacman -Si for repo packages and AUR packages.
 func syncInfo(pkgS []string) (err error) {
 	var info []*rpc.Pkg
+	missing := false
+	pkgS = removeInvalidTargets(pkgS)
 	aurS, repoS, err := packageSlices(pkgS)
 	if err != nil {
 		return
@@ -199,6 +201,7 @@ func syncInfo(pkgS []string) (err error) {
 
 		info, err = aurInfoPrint(noDb)
 		if err != nil {
+			missing = true
 			fmt.Println(err)
 		}
 	}
@@ -214,14 +217,18 @@ func syncInfo(pkgS []string) (err error) {
 		}
 	}
 
+	if len(aurS) != len(info) {
+		missing = true
+	}
+
 	if len(info) != 0 {
 		for _, pkg := range info {
 			PrintInfo(pkg)
 		}
 	}
 
-	if len(repoS)+len(aurS) != len(pkgS) {
-		return fmt.Errorf("Could not find all packages")
+	if missing {
+		err = fmt.Errorf("")
 	}
 
 	return
@@ -288,11 +295,7 @@ func packageSlices(toCheck []string) (aur []string, repo []string, err error) {
 		db, name := splitDbFromName(_pkg)
 		found := false
 
-		if db == "aur" || (mode == ModeAUR && db != "") {
-			continue
-		}
-
-		if db == "aur" || (mode == ModeAUR && db == "") {
+		if db == "aur" || mode == ModeAUR {
 			aur = append(aur, _pkg)
 			continue
 		} else if db != "" || mode == ModeRepo {

+ 23 - 0
utils.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"fmt"
 	"unicode"
 )
 
@@ -103,3 +104,25 @@ func stringSliceEqual(a, b []string) bool {
 
 	return true
 }
+
+func removeInvalidTargets(targets []string) []string {
+	filteredTargets := make([]string, 0)
+
+	for _, target := range targets {
+		db, _ := splitDbFromName(target)
+
+		if db == "aur" && mode == ModeRepo {
+			fmt.Printf("%s %s %s\n", bold(yellow(arrow)), cyan(target), bold("Can't use target with option --repo -- skipping"))
+			continue
+		}
+
+		if db != "aur" && db != "" && mode == ModeAUR {
+			fmt.Printf("%s %s %s\n", bold(yellow(arrow)), cyan(target), bold("Can't use target with option --aur -- skipping"))
+			continue
+		}
+
+		filteredTargets = append(filteredTargets, target)
+	}
+
+	return filteredTargets
+}