diff --git a/depPool.go b/depPool.go index 945984bc..7f1dd386 100644 --- a/depPool.go +++ b/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) diff --git a/download.go b/download.go index 7359aed9..c00a6b96 100644 --- a/download.go +++ b/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 } diff --git a/query.go b/query.go index 150b6a47..f0897c98 100644 --- a/query.go +++ b/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 { diff --git a/utils.go b/utils.go index 71d0dd21..1e926717 100644 --- a/utils.go +++ b/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 +}