summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Nasrat <pnasrat@redhat.com>2005-11-15 03:57:10 +0000
committerPaul Nasrat <pnasrat@redhat.com>2005-11-15 03:57:10 +0000
commit2df6429819de1254468f431b930e3dc63df4b94b (patch)
tree125011d004862ae8c3e37f64f5344145f1597419
parent1f149fb6470bc1157443ec7120413f2f6f0b4d91 (diff)
downloadanaconda-2df6429819de1254468f431b930e3dc63df4b94b.tar.gz
anaconda-2df6429819de1254468f431b930e3dc63df4b94b.tar.xz
anaconda-2df6429819de1254468f431b930e3dc63df4b94b.zip
Move sort logic to yuminstall
-rwxr-xr-xscripts/pkgorder126
-rw-r--r--yuminstall.py103
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: