diff options
author | Paul Nasrat <pnasrat@redhat.com> | 2005-11-15 03:57:10 +0000 |
---|---|---|
committer | Paul Nasrat <pnasrat@redhat.com> | 2005-11-15 03:57:10 +0000 |
commit | 2df6429819de1254468f431b930e3dc63df4b94b (patch) | |
tree | 125011d004862ae8c3e37f64f5344145f1597419 | |
parent | 1f149fb6470bc1157443ec7120413f2f6f0b4d91 (diff) | |
download | anaconda-2df6429819de1254468f431b930e3dc63df4b94b.tar.gz anaconda-2df6429819de1254468f431b930e3dc63df4b94b.tar.xz anaconda-2df6429819de1254468f431b930e3dc63df4b94b.zip |
Move sort logic to yuminstall
-rwxr-xr-x | scripts/pkgorder | 126 | ||||
-rw-r--r-- | yuminstall.py | 103 |
2 files changed, 119 insertions, 110 deletions
diff --git a/scripts/pkgorder b/scripts/pkgorder index ce54d2c19..bbde54ed1 100755 --- a/scripts/pkgorder +++ b/scripts/pkgorder @@ -24,48 +24,16 @@ from repomd.packageSack import PackageSack from repomd.packageObject import PackageObject from yum.transactioninfo import TransactionData, TransactionMember from sortedtransaction import * +from yuminstall import YumSorter from whiteout import whiteout -class YumSorter(yum.YumBase): +class PkgOrderer(YumSorter): def __init__(self, arch=None): - yum.YumBase.__init__(self) - self.arch = arch - self.deps = {} - self.dsCallback = None - self.path = [] - self.loops = [] - self.whiteout = whiteout.split() + YumSorter.__init__(self) + self.arch = arch self._installed = PackageSack() - def doTsSetup(self): - if hasattr(self, 'read_ts'): - return - - if not self.conf.installroot: - raise yum.Errors.YumBaseError, 'Setting up TransactionSets before config class is up' - - installroot = self.conf.installroot - self.read_ts = rpmUtils.transaction.initReadOnlyTransaction(root=installroot) - self.tsInfo = SortableTransactionData() - self.rpmdb = rpmUtils.RpmDBHolder() - self.initActionTs() - - def errorlog(self, value, msg): - #print "Error %s: %s" % (value, msg) - pass - - def filelog(self, value, msg): - pass - - def log(self, value, msg): - pass - #if value <= 3: - # sys.stderr.write("Log: %s\n" % (msg,)) - - def getDownloadPkgs(self): - pass - def addGroup(self, group): pkgs = [] availpackages = {} @@ -81,78 +49,6 @@ class YumSorter(yum.YumBase): member = self.tsInfo.addInstall(availpackages[pkg]) member.sortColour = WHITE - def _provideToPkg(self, req): - best = None - (r, f, v) = req - - satisfiers = [] - for po in self.whatProvides(r, f, v): - if po.name not in satisfiers: - satisfiers.append(po) - - if satisfiers: - best = self.bestPackageFromList(satisfiers) - self.deps[req] = best - - # raise resolution error - - def resolveDeps(self): - - CheckDeps = 1 - - if self.dsCallback: self.dsCallback.start() - - while CheckDeps > 0: - if self.dsCallback: self.dsCallback.tscheck() - unresolved = self.tsCheck() - CheckDeps = len(unresolved) - - - def tsCheck(self): - unresolved = [] - for txmbr in self.tsInfo.getMembers(): - reqs = txmbr.po.returnPrco('requires') - provs = txmbr.po.returnPrco('provides') - reqs.sort() - - for req in reqs: - if req[0].startswith('rpmlib(') or req[0].startswith('config('): - continue -#XXX: handle unresolvable dep - if req in provs: - continue - if req not in self.deps.keys(): - self._provideToPkg(req) - try: - dep = self.deps[req] - except KeyError, e: - raise yum.Errors.DepError, "Unresolvable dependancy %s in %s" % (req[0], txmbr.name) - - # Skip filebased requires on self, etc - if txmbr.name == dep.name: - continue - - if "%s>%s" % (txmbr.name, dep.name) in self.whiteout: - continue -#XXX: handle in rpmdb too - pkgs = self._installed.packagesByTuple(dep.pkgtup) - - if pkgs: - member = self.bestPackageFromList(pkgs) - else: - if self.tsInfo.exists(dep.pkgtup): - pkgs = self.tsInfo.getMembers(pkgtup=dep.pkgtup) - member = self.bestPackageFromList(pkgs) - else: - member = self.tsInfo.addInstall(dep) - unresolved.append(dep) -#Add relationship - firstelts = map(lambda tup: tup[0], txmbr.relatedto) - if member.po.pkgtup not in firstelts: - txmbr.setAsDep(member.po.pkgtup) - - return unresolved - def setup(self, fn="/etc/yum.conf", root="/"): self.doConfigSetup(fn, root) cachedir = yum.misc.getCacheDir() @@ -164,6 +60,18 @@ class YumSorter(yum.YumBase): self.doGroupSetup() self.repos.populateSack(with='filelists') + def errorlog(self, value, msg): + pass + + def filelog(self, value, msg): + pass + + def log(self, value, msg): + pass + + def getDownloadPkgs(self): + pass + #XXX: sigh processed = {} def printMatchingPkgs(ds): @@ -226,7 +134,7 @@ if __name__ == "__main__": (toppath, arch, product) = args config = createConfig(toppath) - ds = YumSorter(arch=arch) + ds = PackageOrderer(arch=arch) ds.setup(fn=config) addGroups(ds, ["Base", "Core", "Text-based Internet"]) diff --git a/yuminstall.py b/yuminstall.py index 9e9d029bb..dc7a937d1 100644 --- a/yuminstall.py +++ b/yuminstall.py @@ -230,7 +230,9 @@ class AnacondaYum(yum.YumBase): self.populateTs(keepold=0) self.ts.check() self.ts.order() + self._run(instLog, cb intf) + def _run(self, instLog, cb, intf) # set log fd. FIXME: this is ugly. see changelog entry from 2005-09-13 self.ts.ts.scriptFd = instLog.fileno() rpm.setLogFile(instLog) @@ -274,9 +276,108 @@ class AnacondaYum(yum.YumBase): pkgs = returnBestPackages(t) return map(lambda x: self.getPackageObject(x), pkgs) -class AnacondaYumMedia(AnacondaYum): +class YumSorter(yum.YumBase): + + def __init__(self): + yum.YumBase.__init__(self) + self.deps = {} + self.path = [] + self.loops = [] + self.whiteout = whiteout.split() + + def run(self, instLog, cb, intf): + self.initActionTs() + self.setColor() + self.populateTs(keepold=0) + + def _provideToPkg(self, req): + best = None + (r, f, v) = req + + satisfiers = [] + for po in self.whatProvides(r, f, v): + if po.name not in satisfiers: + satisfiers.append(po) + + if satisfiers: + best = self.bestPackageFromList(satisfiers) + self.deps[req] = best + # raise resolution error + + def resolveDeps(self): + CheckDeps = 1 + + if self.dsCallback: self.dsCallback.start() + + while CheckDeps > 0: + if self.dsCallback: self.dsCallback.tscheck() + unresolved = self.tsCheck() + CheckDeps = len(unresolved) + + return (2, ['Success - deps resolved']) + + def tsCheck(self): + unresolved = [] + for txmbr in self.tsInfo.getMembers(): + reqs = txmbr.po.returnPrco('requires') + provs = txmbr.po.returnPrco('provides') + reqs.sort() + + for req in reqs: + if req[0].startswith('rpmlib(') or req[0].startswith('config('): + continue +#XXX: handle unresolvable dep + if req in provs: + continue + if req not in self.deps.keys(): + self._provideToPkg(req) + try: + dep = self.deps[req] + except KeyError, e: + raise yum.Errors.DepError, "Unresolvable dependancy %s in %s" % (req[0], txmbr.name) + + # Skip filebased requires on self, etc + if txmbr.name == dep.name: + continue + + if "%s>%s" % (txmbr.name, dep.name) in self.whiteout: + continue +#XXX: handle in rpmdb too for upgrades + if pkgs: + member = self.bestPackageFromList(pkgs) + else: + if self.tsInfo.exists(dep.pkgtup): + pkgs = self.tsInfo.getMembers(pkgtup=dep.pkgtup) + member = self.bestPackageFromList(pkgs) + else: + member = self.tsInfo.addInstall(dep) + unresolved.append(dep) +#Add relationship + firstelts = map(lambda tup: tup[0], txmbr.relatedto) + if member.po.pkgtup not in firstelts: + txmbr.setAsDep(member.po.pkgtup) + + return unresolved + + def doTsSetup(self): + if hasattr(self, 'read_ts'): + return + + if not self.conf.installroot: + raise yum.Errors.YumBaseError, 'Setting up TransactionSets before config class is up' + + installroot = self.conf.installroot + self.read_ts = rpmUtils.transaction.initReadOnlyTransaction(root=installroot) + self.tsInfo = SortableTransactionData() + self.rpmdb = rpmUtils.RpmDBHolder() + self.initActionTs() + + +class AnacondaYumMedia(AnacondaYum, YumSorter): + #XXX: depsolve/sort based on metadata def __init__(self, fn="/etc/yum.conf", root="/"): AnacondaYum.__init__(self, fn=fn, root=root) + YumSorter.__init__(self) def _getcd(self, po): try: |