From 0196a47ad25c6eaebcca18217cf094d4f8128768 Mon Sep 17 00:00:00 2001 From: morganamilo Date: Thu, 19 Jul 2018 19:53:17 +0100 Subject: [PATCH] Refactor combinedupgrade code --- install.go | 185 ++++++++++++++++++++++++++--------------------------- 1 file changed, 92 insertions(+), 93 deletions(-) diff --git a/install.go b/install.go index 62ab6338..79d32b6e 100644 --- a/install.go +++ b/install.go @@ -27,107 +27,37 @@ func install(parser *arguments) error { removeMake := false srcinfosStale := make(map[string]*gosrc.Srcinfo) - //remotenames: names of all non repo packages on the system + if mode == ModeAny || mode == ModeRepo { + if config.CombinedUpgrade { + if parser.existsArg("y", "refresh") { + err = earlyRefresh(parser) + if err != nil { + return fmt.Errorf("Error refreshing databases") + } + } + } else if parser.existsArg("y", "refresh") || parser.existsArg("u", "sysupgrade") || len(parser.targets) > 0 { + err = earlyPacmanCall(parser) + if err != nil { + return err + } + } + } + + //we may have done -Sy, our handle now has an old + //database. + err = initAlpmHandle() + if err != nil { + return err + } + _, _, localNames, remoteNames, err := filterPackages() if err != nil { return err } - //cache as a stringset. maybe make it return a string set in the first - //place remoteNamesCache := sliceToStringSet(remoteNames) localNamesCache := sliceToStringSet(localNames) - if mode == ModeAny || mode == ModeRepo { - if config.CombinedUpgrade { - if parser.existsArg("y", "refresh") { - arguments := parser.copy() - parser.delArg("y", "refresh") - arguments.delArg("u", "sysupgrade") - arguments.delArg("s", "search") - arguments.delArg("i", "info") - arguments.delArg("l", "list") - arguments.clearTargets() - err = show(passToPacman(arguments)) - if err != nil { - return fmt.Errorf("Error installing repo packages") - } - } - } else if parser.existsArg("y", "refresh") || parser.existsArg("u", "sysupgrade") || len(parser.targets) > 0 { - arguments := parser.copy() - arguments.op = "S" - targets := parser.targets - parser.clearTargets() - arguments.clearTargets() - - syncDb, err := alpmHandle.SyncDbs() - if err != nil { - return err - } - - if mode == ModeRepo { - arguments.targets = targets - } else { - alpmHandle.SetQuestionCallback(func(alpm.QuestionAny) {}) - //seperate aur and repo targets - for _, _target := range targets { - target := toTarget(_target) - - if target.Db == "aur" { - parser.addTarget(_target) - continue - } - - var singleDb *alpm.Db - - if target.Db != "" { - singleDb, err = alpmHandle.SyncDbByName(target.Db) - if err != nil { - return err - } - _, err = singleDb.PkgCache().FindSatisfier(target.DepString()) - } else { - _, err = syncDb.FindSatisfier(target.DepString()) - } - - if err == nil { - arguments.addTarget(_target) - } else { - _, err := syncDb.PkgCachebyGroup(target.Name) - if err == nil { - arguments.addTarget(_target) - continue - } - - parser.addTarget(_target) - } - } - } - - if parser.existsArg("y", "refresh") || parser.existsArg("u", "sysupgrade") || len(arguments.targets) > 0 { - err = show(passToPacman(arguments)) - if err != nil { - return fmt.Errorf("Error installing repo packages") - } - } - - //we may have done -Sy, our handle now has an old - //database. - err = initAlpmHandle() - if err != nil { - return err - } - - _, _, localNames, remoteNames, err = filterPackages() - if err != nil { - return err - } - - remoteNamesCache = sliceToStringSet(remoteNames) - localNamesCache = sliceToStringSet(localNames) - } - } - requestTargets := parser.copy().targets //create the arguments to pass for the repo install @@ -413,6 +343,75 @@ func install(parser *arguments) error { return nil } +func inRepos(syncDb alpm.DbList, pkg string) bool { + target := toTarget(pkg) + + if target.Db == "aur" { + return false + } else if target.Db != "" { + return true + } + + _, err := syncDb.FindSatisfier(target.DepString()) + if err == nil { + return true + } + + _, err = syncDb.PkgCachebyGroup(target.Name) + if err == nil { + return true + } + + return false +} + +func earlyPacmanCall(parser *arguments) error { + arguments := parser.copy() + arguments.op = "S" + targets := parser.targets + parser.clearTargets() + arguments.clearTargets() + + syncDb, err := alpmHandle.SyncDbs() + if err != nil { + return err + } + + if mode == ModeRepo { + arguments.targets = targets + } else { + alpmHandle.SetQuestionCallback(func(alpm.QuestionAny) {}) + //seperate aur and repo targets + for _, target := range targets { + if inRepos(syncDb, target) { + arguments.addTarget(target) + } else { + parser.addTarget(target) + } + } + } + + if parser.existsArg("y", "refresh") || parser.existsArg("u", "sysupgrade") || len(arguments.targets) > 0 { + err = show(passToPacman(arguments)) + if err != nil { + return fmt.Errorf("Error installing repo packages") + } + } + + return nil +} + +func earlyRefresh(parser *arguments) error { + arguments := parser.copy() + parser.delArg("y", "refresh") + arguments.delArg("u", "sysupgrade") + arguments.delArg("s", "search") + arguments.delArg("i", "info") + arguments.delArg("l", "list") + arguments.clearTargets() + return show(passToPacman(arguments)) +} + func getIncompatible(pkgs []*rpc.Pkg, srcinfos map[string]*gosrc.Srcinfo, bases map[string][]*rpc.Pkg) (stringSet, error) { incompatible := make(stringSet) alpmArch, err := alpmHandle.Arch()