diff --git a/callbacks.go b/callbacks.go deleted file mode 100644 index 0099c6c..0000000 --- a/callbacks.go +++ /dev/null @@ -1,94 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "os" - "strconv" - - alpm "github.com/Jguer/go-alpm" - "github.com/leonelquinteros/gotext" - - "github.com/Jguer/yay/v10/pkg/settings" - "github.com/Jguer/yay/v10/pkg/text" -) - -func questionCallback(question alpm.QuestionAny) { - if qi, err := question.QuestionInstallIgnorepkg(); err == nil { - qi.SetInstall(true) - } - - qp, err := question.QuestionSelectProvider() - if err != nil { - return - } - - if settings.HideMenus { - return - } - - size := 0 - - _ = qp.Providers(config.Runtime.AlpmHandle).ForEach(func(pkg alpm.Package) error { - size++ - return nil - }) - - str := text.Bold(gotext.Get("There are %d providers available for %s:\n", size, qp.Dep())) - - size = 1 - var db string - - _ = qp.Providers(config.Runtime.AlpmHandle).ForEach(func(pkg alpm.Package) error { - thisDB := pkg.DB().Name() - - if db != thisDB { - db = thisDB - str += text.SprintOperationInfo(gotext.Get("Repository"), db, "\n ") - } - str += fmt.Sprintf("%d) %s ", size, pkg.Name()) - size++ - return nil - }) - - text.OperationInfoln(str) - - for { - fmt.Print(gotext.Get("\nEnter a number (default=1): ")) - - if config.NoConfirm { - fmt.Println() - break - } - - reader := bufio.NewReader(os.Stdin) - numberBuf, overflow, err := reader.ReadLine() - if err != nil { - text.Errorln(err) - break - } - - if overflow { - text.Errorln(gotext.Get(" Input too long")) - continue - } - - if string(numberBuf) == "" { - break - } - - num, err := strconv.Atoi(string(numberBuf)) - if err != nil { - text.Errorln(gotext.Get("invalid number: %s", string(numberBuf))) - continue - } - - if num < 1 || num > size { - text.Errorln(gotext.Get("invalid value: %d is not between %d and %d", num, 1, size)) - continue - } - - qp.SetUseIndex(num - 1) - break - } -} diff --git a/clean.go b/clean.go index aba2e2b..cc5e145 100644 --- a/clean.go +++ b/clean.go @@ -38,7 +38,7 @@ func removeVCSPackage(pkgs []string) { } // CleanDependencies removes all dangling dependencies in system -func cleanDependencies(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor, removeOptional bool) error { +func cleanDependencies(cmdArgs *settings.Arguments, dbExecutor db.Executor, removeOptional bool) error { hanging := hangingPackages(removeOptional, dbExecutor) if len(hanging) != 0 { return cleanRemove(cmdArgs, hanging) @@ -60,7 +60,7 @@ func cleanRemove(cmdArgs *settings.Arguments, pkgNames []string) error { return show(passToPacman(arguments)) } -func syncClean(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func syncClean(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { keepInstalled := false keepCurrent := false @@ -110,7 +110,7 @@ func syncClean(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { return nil } -func cleanAUR(keepInstalled, keepCurrent, removeAll bool, dbExecutor *db.AlpmExecutor) error { +func cleanAUR(keepInstalled, keepCurrent, removeAll bool, dbExecutor db.Executor) error { fmt.Println(gotext.Get("removing AUR packages from cache...")) installedBases := make(stringset.StringSet) diff --git a/cmd.go b/cmd.go index 330e1c7..8ef8efe 100644 --- a/cmd.go +++ b/cmd.go @@ -139,7 +139,7 @@ getpkgbuild specific options: -f --force Force download for existing ABS packages`) } -func handleCmd(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func handleCmd(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { if cmdArgs.ExistsArg("h", "help") { return handleHelp(cmdArgs) } @@ -177,7 +177,7 @@ func handleCmd(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { return fmt.Errorf(gotext.Get("unhandled operation")) } -func handleQuery(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func handleQuery(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { if cmdArgs.ExistsArg("u", "upgrades") { return printUpdateList(cmdArgs, dbExecutor, cmdArgs.ExistsDouble("u", "sysupgrade")) } @@ -196,7 +196,7 @@ func handleVersion() { fmt.Printf("yay v%s - libalpm v%s\n", yayVersion, alpm.Version()) } -func handlePrint(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) (err error) { +func handlePrint(cmdArgs *settings.Arguments, dbExecutor db.Executor) (err error) { switch { case cmdArgs.ExistsArg("d", "defaultconfig"): tmpConfig := settings.MakeConfig() @@ -222,7 +222,7 @@ func handlePrint(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) (err return err } -func handleYay(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func handleYay(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { if cmdArgs.ExistsArg("gendb") { return createDevelDB(config.Runtime.VCSPath, dbExecutor) } @@ -238,16 +238,16 @@ func handleYay(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { return nil } -func handleGetpkgbuild(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func handleGetpkgbuild(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { return getPkgbuilds(cmdArgs.Targets, dbExecutor, cmdArgs.ExistsArg("f", "force")) } -func handleYogurt(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func handleYogurt(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { config.SearchMode = numberMenu return displayNumberMenu(cmdArgs.Targets, dbExecutor, cmdArgs) } -func handleSync(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func handleSync(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { targets := cmdArgs.Targets if cmdArgs.ExistsArg("s", "search") { @@ -295,7 +295,7 @@ func handleRemove(cmdArgs *settings.Arguments) error { } // NumberMenu presents a CLI for selecting packages to install. -func displayNumberMenu(pkgS []string, dbExecutor *db.AlpmExecutor, cmdArgs *settings.Arguments) error { +func displayNumberMenu(pkgS []string, dbExecutor db.Executor, cmdArgs *settings.Arguments) error { var ( aurErr, repoErr error aq aurQuery @@ -408,7 +408,7 @@ func displayNumberMenu(pkgS []string, dbExecutor *db.AlpmExecutor, cmdArgs *sett return install(arguments, dbExecutor, true) } -func syncList(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func syncList(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { aur := false for i := len(cmdArgs.Targets) - 1; i >= 0; i-- { diff --git a/download.go b/download.go index 95b6581..26a3e48 100644 --- a/download.go +++ b/download.go @@ -140,7 +140,7 @@ func gitMerge(path, name string) error { return nil } -func getPkgbuilds(pkgs []string, dbExecutor *db.AlpmExecutor, force bool) error { +func getPkgbuilds(pkgs []string, dbExecutor db.Executor, force bool) error { missing := false wd, err := os.Getwd() if err != nil { @@ -209,7 +209,7 @@ func getPkgbuilds(pkgs []string, dbExecutor *db.AlpmExecutor, force bool) error } // GetPkgbuild downloads pkgbuild from the ABS. -func getPkgbuildsfromABS(pkgs []string, path string, dbExecutor *db.AlpmExecutor, force bool) (bool, error) { +func getPkgbuildsfromABS(pkgs []string, path string, dbExecutor db.Executor, force bool) (bool, error) { var wg sync.WaitGroup var mux sync.Mutex var errs multierror.MultiError diff --git a/install.go b/install.go index 586dc37..5d925e9 100644 --- a/install.go +++ b/install.go @@ -62,7 +62,7 @@ func asexp(cmdArgs *settings.Arguments, pkgs []string) error { } // Install handles package installs -func install(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor, ignoreProviders bool) (err error) { +func install(cmdArgs *settings.Arguments, dbExecutor db.Executor, ignoreProviders bool) (err error) { var incompatible stringset.StringSet var do *dep.Order @@ -402,7 +402,7 @@ func removeMake(do *dep.Order) error { return err } -func inRepos(dbExecutor *db.AlpmExecutor, pkg string) bool { +func inRepos(dbExecutor db.Executor, pkg string) bool { target := dep.ToTarget(pkg) if target.DB == "aur" { @@ -419,7 +419,7 @@ func inRepos(dbExecutor *db.AlpmExecutor, pkg string) bool { return exists || len(dbExecutor.PackagesFromGroup(target.Name)) > 0 } -func earlyPacmanCall(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error { +func earlyPacmanCall(cmdArgs *settings.Arguments, dbExecutor db.Executor) error { arguments := cmdArgs.Copy() arguments.Op = "S" targets := cmdArgs.Targets @@ -459,7 +459,7 @@ func earlyRefresh(cmdArgs *settings.Arguments) error { return show(passToPacman(arguments)) } -func getIncompatible(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo, dbExecutor *db.AlpmExecutor) (stringset.StringSet, error) { +func getIncompatible(bases []dep.Base, srcinfos map[string]*gosrc.Srcinfo, dbExecutor db.Executor) (stringset.StringSet, error) { incompatible := make(stringset.StringSet) basesMap := make(map[string]dep.Base) alpmArch, err := dbExecutor.AlpmArch() @@ -933,7 +933,7 @@ func downloadPkgbuildsSources(bases []dep.Base, incompatible stringset.StringSet func buildInstallPkgbuilds( cmdArgs *settings.Arguments, - dbExecutor *db.AlpmExecutor, + dbExecutor db.Executor, dp *dep.Pool, do *dep.Order, srcinfos map[string]*gosrc.Srcinfo, diff --git a/main.go b/main.go index db485b0..b6d9440 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "github.com/leonelquinteros/gotext" "github.com/Jguer/yay/v10/pkg/db" + "github.com/Jguer/yay/v10/pkg/db/ialpm" "github.com/Jguer/yay/v10/pkg/settings" "github.com/Jguer/yay/v10/pkg/text" ) @@ -197,7 +198,7 @@ func main() { text.UseColor = useColor - dbExecutor, err := db.NewExecutor(runtime.PacmanConf, questionCallback) + dbExecutor, err := ialpm.NewExecutor(runtime.PacmanConf) if err != nil { if str := err.Error(); str != "" { fmt.Fprintln(os.Stderr, str) @@ -207,7 +208,7 @@ func main() { } defer dbExecutor.Cleanup() - err = handleCmd(cmdArgs, dbExecutor) + err = handleCmd(cmdArgs, db.Executor(dbExecutor)) if err != nil { if str := err.Error(); str != "" { fmt.Fprintln(os.Stderr, str) diff --git a/pkg/completion/completion.go b/pkg/completion/completion.go index fc6e79c..3668d59 100644 --- a/pkg/completion/completion.go +++ b/pkg/completion/completion.go @@ -16,7 +16,7 @@ import ( ) // Show provides completion info for shells -func Show(dbExecutor *db.AlpmExecutor, aurURL, completionPath string, interval int, force bool) error { +func Show(dbExecutor db.Executor, aurURL, completionPath string, interval int, force bool) error { err := Update(dbExecutor, aurURL, completionPath, interval, force) if err != nil { return err @@ -33,7 +33,7 @@ func Show(dbExecutor *db.AlpmExecutor, aurURL, completionPath string, interval i } // Update updates completion cache to be used by Complete -func Update(dbExecutor *db.AlpmExecutor, aurURL, completionPath string, interval int, force bool) error { +func Update(dbExecutor db.Executor, aurURL, completionPath string, interval int, force bool) error { info, err := os.Stat(completionPath) if os.IsNotExist(err) || (interval != -1 && time.Since(info.ModTime()).Hours() >= float64(interval*24)) || force { @@ -93,7 +93,7 @@ func createAURList(aurURL string, out io.Writer) error { } // CreatePackageList appends Repo packages to completion cache -func createRepoList(dbExecutor *db.AlpmExecutor, out io.Writer) error { +func createRepoList(dbExecutor db.Executor, out io.Writer) error { for _, pkg := range dbExecutor.SyncPackages() { _, err := io.WriteString(out, pkg.Name()+"\t"+pkg.DB().Name()+"\n") if err != nil { diff --git a/pkg/db/executor.go b/pkg/db/executor.go index 003af4a..cefe7f9 100644 --- a/pkg/db/executor.go +++ b/pkg/db/executor.go @@ -4,6 +4,8 @@ import ( "time" alpm "github.com/Jguer/go-alpm" + + "github.com/Jguer/yay/v10/pkg/upgrade" ) type RepoPackage interface { @@ -18,3 +20,26 @@ type RepoPackage interface { Version() string Reason() alpm.PkgReason } + +type Executor interface { + AlpmArch() (string, error) + BiggestPackages() []RepoPackage + Cleanup() + IsCorrectVersionInstalled(string, string) bool + LastBuildTime() time.Time + LocalPackage(string) RepoPackage + LocalPackages() []RepoPackage + LocalSatisfierExists(string) bool + PackageConflicts(RepoPackage) []alpm.Depend + PackageDepends(RepoPackage) []alpm.Depend + PackageFromDB(string, string) RepoPackage + PackageGroups(RepoPackage) []string + PackageOptionalDepends(RepoPackage) []alpm.Depend + PackageProvides(RepoPackage) []alpm.Depend + PackagesFromGroup(string) []RepoPackage + RefreshHandle() error + RepoUpgrades(bool) (upgrade.UpSlice, error) + SyncPackages(...string) []RepoPackage + SyncSatisfier(string) RepoPackage + SyncSatisfierExists(string) bool +} diff --git a/pkg/db/alpm.go b/pkg/db/ialpm/alpm.go similarity index 65% rename from pkg/db/alpm.go rename to pkg/db/ialpm/alpm.go index d94e679..dcf7252 100644 --- a/pkg/db/alpm.go +++ b/pkg/db/ialpm/alpm.go @@ -1,30 +1,32 @@ -package db +package ialpm import ( + "bufio" "errors" "fmt" "os" + "strconv" "time" alpm "github.com/Jguer/go-alpm" pacmanconf "github.com/Morganamilo/go-pacmanconf" "github.com/leonelquinteros/gotext" + "github.com/Jguer/yay/v10/pkg/db" + "github.com/Jguer/yay/v10/pkg/settings" "github.com/Jguer/yay/v10/pkg/text" "github.com/Jguer/yay/v10/pkg/upgrade" ) type AlpmExecutor struct { - handle *alpm.Handle - localDB *alpm.DB - syncDB alpm.DBList - conf *pacmanconf.Config - questionCallback func(question alpm.QuestionAny) + handle *alpm.Handle + localDB *alpm.DB + syncDB alpm.DBList + conf *pacmanconf.Config } -func NewExecutor(pacamnConf *pacmanconf.Config, - questionCallback func(question alpm.QuestionAny)) (*AlpmExecutor, error) { - ae := &AlpmExecutor{conf: pacamnConf, questionCallback: questionCallback} +func NewExecutor(pacamnConf *pacmanconf.Config) (*AlpmExecutor, error) { + ae := &AlpmExecutor{conf: pacamnConf} err := ae.RefreshHandle() if err != nil { @@ -76,13 +78,13 @@ func configureAlpm(pacmanConf *pacmanconf.Config, alpmHandle *alpm.Handle) error for _, repo := range pacmanConf.Repos { // TODO: set SigLevel - db, err := alpmHandle.RegisterSyncDB(repo.Name, 0) + alpmDB, err := alpmHandle.RegisterSyncDB(repo.Name, 0) if err != nil { return err } - db.SetServers(repo.Servers) - db.SetUsage(toUsage(repo.Usage)) + alpmDB.SetServers(repo.Servers) + alpmDB.SetUsage(toUsage(repo.Usage)) } if err := alpmHandle.SetCacheDirs(pacmanConf.CacheDir); err != nil { @@ -152,6 +154,89 @@ func logCallback(level alpm.LogLevel, str string) { } } +func (ae *AlpmExecutor) questionCallback() func(question alpm.QuestionAny) { + return func(question alpm.QuestionAny) { + if qi, err := question.QuestionInstallIgnorepkg(); err == nil { + qi.SetInstall(true) + } + + qp, err := question.QuestionSelectProvider() + if err != nil { + return + } + + if settings.HideMenus { + return + } + + size := 0 + + _ = qp.Providers(ae.handle).ForEach(func(pkg alpm.Package) error { + size++ + return nil + }) + + str := text.Bold(gotext.Get("There are %d providers available for %s:\n", size, qp.Dep())) + + size = 1 + var dbName string + + _ = qp.Providers(ae.handle).ForEach(func(pkg alpm.Package) error { + thisDB := pkg.DB().Name() + + if dbName != thisDB { + dbName = thisDB + str += text.SprintOperationInfo(gotext.Get("Repository"), dbName, "\n ") + } + str += fmt.Sprintf("%d) %s ", size, pkg.Name()) + size++ + return nil + }) + + text.OperationInfoln(str) + + for { + fmt.Print(gotext.Get("\nEnter a number (default=1): ")) + + // TODO: reenable noconfirm + // if config.NoConfirm { + // fmt.Println() + // break + // } + + reader := bufio.NewReader(os.Stdin) + numberBuf, overflow, err := reader.ReadLine() + if err != nil { + text.Errorln(err) + break + } + + if overflow { + text.Errorln(gotext.Get(" Input too long")) + continue + } + + if string(numberBuf) == "" { + break + } + + num, err := strconv.Atoi(string(numberBuf)) + if err != nil { + text.Errorln(gotext.Get("invalid number: %s", string(numberBuf))) + continue + } + + if num < 1 || num > size { + text.Errorln(gotext.Get("invalid value: %d is not between %d and %d", num, 1, size)) + continue + } + + qp.SetUseIndex(num - 1) + break + } + } +} + func (ae *AlpmExecutor) RefreshHandle() error { if ae.handle != nil { if errRelease := ae.handle.Release(); errRelease != nil { @@ -168,7 +253,7 @@ func (ae *AlpmExecutor) RefreshHandle() error { return errConf } - alpmHandle.SetQuestionCallback(ae.questionCallback) + alpmHandle.SetQuestionCallback(ae.questionCallback()) alpmHandle.SetLogCallback(logCallback) ae.handle = alpmHandle ae.syncDB, err = alpmHandle.SyncDBs() @@ -203,7 +288,7 @@ func (ae *AlpmExecutor) IsCorrectVersionInstalled(pkgName, versionRequired strin return alpmPackage.Version() == versionRequired } -func (ae *AlpmExecutor) SyncSatisfier(pkgName string) RepoPackage { +func (ae *AlpmExecutor) SyncSatisfier(pkgName string) db.RepoPackage { foundPkg, err := ae.syncDB.FindSatisfier(pkgName) if err != nil { return nil @@ -211,8 +296,8 @@ func (ae *AlpmExecutor) SyncSatisfier(pkgName string) RepoPackage { return foundPkg } -func (ae *AlpmExecutor) PackagesFromGroup(groupName string) []RepoPackage { - groupPackages := []RepoPackage{} +func (ae *AlpmExecutor) PackagesFromGroup(groupName string) []db.RepoPackage { + groupPackages := []db.RepoPackage{} _ = ae.syncDB.FindGroupPkgs(groupName).ForEach(func(pkg alpm.Package) error { groupPackages = append(groupPackages, &pkg) return nil @@ -220,27 +305,27 @@ func (ae *AlpmExecutor) PackagesFromGroup(groupName string) []RepoPackage { return groupPackages } -func (ae *AlpmExecutor) LocalPackages() []RepoPackage { - localPackages := []RepoPackage{} +func (ae *AlpmExecutor) LocalPackages() []db.RepoPackage { + localPackages := []db.RepoPackage{} _ = ae.localDB.PkgCache().ForEach(func(pkg alpm.Package) error { - localPackages = append(localPackages, RepoPackage(&pkg)) + localPackages = append(localPackages, db.RepoPackage(&pkg)) return nil }) return localPackages } // SyncPackages searches SyncDB for packages or returns all packages if no search param is given -func (ae *AlpmExecutor) SyncPackages(pkgNames ...string) []RepoPackage { - repoPackages := []RepoPackage{} - _ = ae.syncDB.ForEach(func(db alpm.DB) error { +func (ae *AlpmExecutor) SyncPackages(pkgNames ...string) []db.RepoPackage { + repoPackages := []db.RepoPackage{} + _ = ae.syncDB.ForEach(func(alpmDB alpm.DB) error { if len(pkgNames) == 0 { - _ = db.PkgCache().ForEach(func(pkg alpm.Package) error { - repoPackages = append(repoPackages, RepoPackage(&pkg)) + _ = alpmDB.PkgCache().ForEach(func(pkg alpm.Package) error { + repoPackages = append(repoPackages, db.RepoPackage(&pkg)) return nil }) } else { - _ = db.Search(pkgNames).ForEach(func(pkg alpm.Package) error { - repoPackages = append(repoPackages, RepoPackage(&pkg)) + _ = alpmDB.Search(pkgNames).ForEach(func(pkg alpm.Package) error { + repoPackages = append(repoPackages, db.RepoPackage(&pkg)) return nil }) } @@ -249,7 +334,7 @@ func (ae *AlpmExecutor) SyncPackages(pkgNames ...string) []RepoPackage { return repoPackages } -func (ae *AlpmExecutor) LocalPackage(pkgName string) RepoPackage { +func (ae *AlpmExecutor) LocalPackage(pkgName string) db.RepoPackage { pkg := ae.localDB.Pkg(pkgName) if pkg == nil { return nil @@ -257,7 +342,7 @@ func (ae *AlpmExecutor) LocalPackage(pkgName string) RepoPackage { return pkg } -func (ae *AlpmExecutor) PackageFromDB(pkgName, dbName string) RepoPackage { +func (ae *AlpmExecutor) PackageFromDB(pkgName, dbName string) db.RepoPackage { singleDB, err := ae.handle.SyncDBByName(dbName) if err != nil { return nil @@ -269,27 +354,27 @@ func (ae *AlpmExecutor) PackageFromDB(pkgName, dbName string) RepoPackage { return foundPkg } -func (ae *AlpmExecutor) PackageDepends(pkg RepoPackage) []alpm.Depend { +func (ae *AlpmExecutor) PackageDepends(pkg db.RepoPackage) []alpm.Depend { alpmPackage := pkg.(*alpm.Package) return alpmPackage.Depends().Slice() } -func (ae *AlpmExecutor) PackageOptionalDepends(pkg RepoPackage) []alpm.Depend { +func (ae *AlpmExecutor) PackageOptionalDepends(pkg db.RepoPackage) []alpm.Depend { alpmPackage := pkg.(*alpm.Package) return alpmPackage.OptionalDepends().Slice() } -func (ae *AlpmExecutor) PackageProvides(pkg RepoPackage) []alpm.Depend { +func (ae *AlpmExecutor) PackageProvides(pkg db.RepoPackage) []alpm.Depend { alpmPackage := pkg.(*alpm.Package) return alpmPackage.Provides().Slice() } -func (ae *AlpmExecutor) PackageConflicts(pkg RepoPackage) []alpm.Depend { +func (ae *AlpmExecutor) PackageConflicts(pkg db.RepoPackage) []alpm.Depend { alpmPackage := pkg.(*alpm.Package) return alpmPackage.Conflicts().Slice() } -func (ae *AlpmExecutor) PackageGroups(pkg RepoPackage) []string { +func (ae *AlpmExecutor) PackageGroups(pkg db.RepoPackage) []string { alpmPackage := pkg.(*alpm.Package) return alpmPackage.Groups().Slice() } @@ -340,10 +425,10 @@ func (ae *AlpmExecutor) AlpmArch() (string, error) { return ae.handle.Arch() } -func (ae *AlpmExecutor) BiggestPackages() []RepoPackage { - localPackages := []RepoPackage{} +func (ae *AlpmExecutor) BiggestPackages() []db.RepoPackage { + localPackages := []db.RepoPackage{} _ = ae.localDB.PkgCache().SortBySize().ForEach(func(pkg alpm.Package) error { - localPackages = append(localPackages, RepoPackage(&pkg)) + localPackages = append(localPackages, db.RepoPackage(&pkg)) return nil }) return localPackages diff --git a/pkg/db/alpm_test.go b/pkg/db/ialpm/alpm_test.go similarity index 96% rename from pkg/db/alpm_test.go rename to pkg/db/ialpm/alpm_test.go index f991673..e32eb74 100644 --- a/pkg/db/alpm_test.go +++ b/pkg/db/ialpm/alpm_test.go @@ -1,9 +1,8 @@ -package db +package ialpm import ( "testing" - alpm "github.com/Jguer/go-alpm" "github.com/Morganamilo/go-pacmanconf" "github.com/stretchr/testify/assert" ) @@ -37,7 +36,7 @@ func TestAlpmExecutor(t *testing.T) { {Name: "repo1", Servers: []string{"repo1"}, SigLevel: []string(nil), Usage: []string{"All"}}, {Name: "repo2", Servers: []string{"repo2"}, SigLevel: []string(nil), Usage: []string{"All"}}}} - aExec, err := NewExecutor(pacmanConf, func(question alpm.QuestionAny) {}) + aExec, err := NewExecutor(pacmanConf) assert.NoError(t, err) assert.NotNil(t, aExec.conf) diff --git a/pkg/dep/dep.go b/pkg/dep/dep.go index 2576234..e135365 100644 --- a/pkg/dep/dep.go +++ b/pkg/dep/dep.go @@ -121,12 +121,12 @@ func satisfiesAur(dep string, pkg *rpc.Pkg) bool { return false } -func satisfiesRepo(dep string, pkg db.RepoPackage, ae *db.AlpmExecutor) bool { +func satisfiesRepo(dep string, pkg db.RepoPackage, dbExecutor db.Executor) bool { if pkgSatisfies(pkg.Name(), pkg.Version(), dep) { return true } - for _, provided := range ae.PackageProvides(pkg) { + for _, provided := range dbExecutor.PackageProvides(pkg) { if provideSatisfies(provided.String(), dep) { return true } diff --git a/pkg/dep/depPool.go b/pkg/dep/depPool.go index 27b737e..9cd5664 100644 --- a/pkg/dep/depPool.go +++ b/pkg/dep/depPool.go @@ -57,11 +57,11 @@ type Pool struct { Aur map[string]*rpc.Pkg AurCache map[string]*rpc.Pkg Groups []string - AlpmExecutor *db.AlpmExecutor + AlpmExecutor db.Executor Warnings *query.AURWarnings } -func makePool(dbExecutor *db.AlpmExecutor) *Pool { +func makePool(dbExecutor db.Executor) *Pool { dp := &Pool{ make([]Target, 0), make(stringset.StringSet), @@ -347,7 +347,7 @@ func (dp *Pool) ResolveRepoDependency(pkg db.RepoPackage) { func GetPool(pkgs []string, warnings *query.AURWarnings, - dbExecutor *db.AlpmExecutor, + dbExecutor db.Executor, mode settings.TargetMode, ignoreProviders, noConfirm, provides bool, rebuild string, splitN int) (*Pool, error) { diff --git a/pkg/query/filter.go b/pkg/query/filter.go index 7661c11..755f624 100644 --- a/pkg/query/filter.go +++ b/pkg/query/filter.go @@ -9,7 +9,7 @@ import ( ) // GetPackageNamesBySource returns package names with and without correspondence in SyncDBS respectively -func GetPackageNamesBySource(dbExecutor *db.AlpmExecutor) (local, remote []string, err error) { +func GetPackageNamesBySource(dbExecutor db.Executor) (local, remote []string, err error) { outer: for _, localpkg := range dbExecutor.LocalPackages() { for _, syncpkg := range dbExecutor.SyncPackages() { @@ -24,7 +24,7 @@ outer: } // GetRemotePackages returns packages with no correspondence in SyncDBS. -func GetRemotePackages(dbExecutor *db.AlpmExecutor) ( +func GetRemotePackages(dbExecutor db.Executor) ( remote []db.RepoPackage, remoteNames []string) { outer: diff --git a/pkg/settings/runtime.go b/pkg/settings/runtime.go index 0ef154b..c1eb08e 100644 --- a/pkg/settings/runtime.go +++ b/pkg/settings/runtime.go @@ -4,7 +4,6 @@ import ( "os" "path/filepath" - "github.com/Jguer/go-alpm" "github.com/Morganamilo/go-pacmanconf" "github.com/leonelquinteros/gotext" "github.com/pkg/errors" @@ -35,8 +34,7 @@ type Runtime struct { ConfigPath string VCSPath string PacmanConf *pacmanconf.Config - AlpmHandle *alpm.Handle - DBExecutor *db.AlpmExecutor + DBExecutor db.Executor } func MakeRuntime() (*Runtime, error) { diff --git a/print.go b/print.go index debbb3b..3ccf78f 100644 --- a/print.go +++ b/print.go @@ -17,7 +17,7 @@ import ( ) // PrintSearch handles printing search results in a given format -func (q aurQuery) printSearch(start int, dbExecutor *db.AlpmExecutor) { +func (q aurQuery) printSearch(start int, dbExecutor db.Executor) { for i := range q { var toprint string if config.SearchMode == numberMenu { @@ -60,7 +60,7 @@ func (q aurQuery) printSearch(start int, dbExecutor *db.AlpmExecutor) { } // PrintSearch receives a RepoSearch type and outputs pretty text. -func (s repoQuery) printSearch(dbExecutor *db.AlpmExecutor) { +func (s repoQuery) printSearch(dbExecutor db.Executor) { for i, res := range s { var toprint string if config.SearchMode == numberMenu { @@ -142,7 +142,7 @@ func PrintInfo(a *rpc.Pkg, extendedInfo bool) { } // BiggestPackages prints the name of the ten biggest packages in the system. -func biggestPackages(dbExecutor *db.AlpmExecutor) { +func biggestPackages(dbExecutor db.Executor) { pkgS := dbExecutor.BiggestPackages() if len(pkgS) < 10 { @@ -156,7 +156,7 @@ func biggestPackages(dbExecutor *db.AlpmExecutor) { } // localStatistics prints installed packages statistics. -func localStatistics(dbExecutor *db.AlpmExecutor) error { +func localStatistics(dbExecutor db.Executor) error { info := statistics(dbExecutor) _, remoteNames, err := query.GetPackageNamesBySource(config.Runtime.DBExecutor) @@ -181,7 +181,7 @@ func localStatistics(dbExecutor *db.AlpmExecutor) error { } // TODO: Make it less hacky -func printNumberOfUpdates(dbExecutor *db.AlpmExecutor, enableDowngrade bool) error { +func printNumberOfUpdates(dbExecutor db.Executor, enableDowngrade bool) error { warnings := query.NewWarnings() old := os.Stdout // keep backup of the real stdout os.Stdout = nil @@ -196,7 +196,7 @@ func printNumberOfUpdates(dbExecutor *db.AlpmExecutor, enableDowngrade bool) err } // TODO: Make it less hacky -func printUpdateList(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor, enableDowngrade bool) error { +func printUpdateList(cmdArgs *settings.Arguments, dbExecutor db.Executor, enableDowngrade bool) error { targets := stringset.FromSlice(cmdArgs.Targets) warnings := query.NewWarnings() old := os.Stdout // keep backup of the real stdout diff --git a/query.go b/query.go index 082a072..8067ce9 100644 --- a/query.go +++ b/query.go @@ -147,7 +147,7 @@ func narrowSearch(pkgS []string, sortS bool) (aurQuery, error) { } // SyncSearch presents a query to the local repos and to the AUR. -func syncSearch(pkgS []string, dbExecutor *db.AlpmExecutor) (err error) { +func syncSearch(pkgS []string, dbExecutor db.Executor) (err error) { pkgS = query.RemoveInvalidTargets(pkgS, config.Runtime.Mode) var aurErr error var aq aurQuery @@ -188,7 +188,7 @@ func syncSearch(pkgS []string, dbExecutor *db.AlpmExecutor) (err error) { } // SyncInfo serves as a pacman -Si for repo packages and AUR packages. -func syncInfo(cmdArgs *settings.Arguments, pkgS []string, dbExecutor *db.AlpmExecutor) error { +func syncInfo(cmdArgs *settings.Arguments, pkgS []string, dbExecutor db.Executor) error { var info []*rpc.Pkg var err error missing := false @@ -240,7 +240,7 @@ func syncInfo(cmdArgs *settings.Arguments, pkgS []string, dbExecutor *db.AlpmExe } // Search handles repo searches. Creates a RepoSearch struct. -func queryRepo(pkgInputN []string, dbExecutor *db.AlpmExecutor) repoQuery { +func queryRepo(pkgInputN []string, dbExecutor db.Executor) repoQuery { s := repoQuery(dbExecutor.SyncPackages(pkgInputN...)) if config.SortMode == settings.BottomUp { @@ -250,7 +250,7 @@ func queryRepo(pkgInputN []string, dbExecutor *db.AlpmExecutor) repoQuery { } // PackageSlices separates an input slice into aur and repo slices -func packageSlices(toCheck []string, dbExecutor *db.AlpmExecutor) (aur, repo []string) { +func packageSlices(toCheck []string, dbExecutor db.Executor) (aur, repo []string) { for _, _pkg := range toCheck { dbName, name := text.SplitDBFromName(_pkg) found := false @@ -282,7 +282,7 @@ func packageSlices(toCheck []string, dbExecutor *db.AlpmExecutor) (aur, repo []s // HangingPackages returns a list of packages installed as deps // and unneeded by the system // removeOptional decides whether optional dependencies are counted or not -func hangingPackages(removeOptional bool, dbExecutor *db.AlpmExecutor) (hanging []string) { +func hangingPackages(removeOptional bool, dbExecutor db.Executor) (hanging []string) { // safePackages represents every package in the system in one of 3 states // State = 0 - Remove package from the system // State = 1 - Keep package in the system; need to iterate over dependencies @@ -356,7 +356,7 @@ func hangingPackages(removeOptional bool, dbExecutor *db.AlpmExecutor) (hanging } // Statistics returns statistics about packages installed in system -func statistics(dbExecutor *db.AlpmExecutor) *struct { +func statistics(dbExecutor db.Executor) *struct { Totaln int Expln int TotalSize int64 diff --git a/upgrade.go b/upgrade.go index 047135a..de0a98a 100644 --- a/upgrade.go +++ b/upgrade.go @@ -23,7 +23,7 @@ import ( ) // upList returns lists of packages to upgrade from each source. -func upList(warnings *query.AURWarnings, dbExecutor *db.AlpmExecutor, enableDowngrade bool) (aurUp, repoUp upgrade.UpSlice, err error) { +func upList(warnings *query.AURWarnings, dbExecutor db.Executor, enableDowngrade bool) (aurUp, repoUp upgrade.UpSlice, err error) { remote, remoteNames := query.GetRemotePackages(dbExecutor) var wg sync.WaitGroup @@ -139,10 +139,12 @@ func upDevel(remote []db.RepoPackage, aurdata map[string]*rpc.Pkg) upgrade.UpSli printIgnoringPackage(pkg, "latest-commit") } else { toUpgrade = append(toUpgrade, - upgrade.Upgrade{Name: pkg.Name(), + upgrade.Upgrade{ + Name: pkg.Name(), Repository: "devel", LocalVersion: pkg.Version(), - RemoteVersion: "latest-commit"}) + RemoteVersion: "latest-commit", + }) } } @@ -180,7 +182,8 @@ func upAUR(remote []db.RepoPackage, aurdata map[string]*rpc.Pkg) upgrade.UpSlice Name: aurPkg.Name, Repository: "aur", LocalVersion: pkg.Version(), - RemoteVersion: aurPkg.Version}) + RemoteVersion: aurPkg.Version, + }) } } } diff --git a/vcs.go b/vcs.go index d90b74a..503be12 100644 --- a/vcs.go +++ b/vcs.go @@ -31,7 +31,7 @@ type ( ) // createDevelDB forces yay to create a DB of the existing development packages -func createDevelDB(vcsFilePath string, dbExecutor *db.AlpmExecutor) error { +func createDevelDB(vcsFilePath string, dbExecutor db.Executor) error { var mux sync.Mutex var wg sync.WaitGroup