diff options
author | Jeremy Katz <katzj@redhat.com> | 2005-12-13 17:57:01 +0000 |
---|---|---|
committer | Jeremy Katz <katzj@redhat.com> | 2005-12-13 17:57:01 +0000 |
commit | ce41ca79845168a9bf51ca7e693abc4d5f156880 (patch) | |
tree | f1815cfff5f44ebbb6098e9a213de317db8a8205 /yuminstall.py | |
parent | e0db1a030aa146388ea8cf69c1efc114cd0e11d5 (diff) | |
download | anaconda-ce41ca79845168a9bf51ca7e693abc4d5f156880.tar.gz anaconda-ce41ca79845168a9bf51ca7e693abc4d5f156880.tar.xz anaconda-ce41ca79845168a9bf51ca7e693abc4d5f156880.zip |
2005-12-13 Jeremy Katz <katzj@redhat.com>
* yuminstall.py: Profiling with hotshot for fun, profit and
going from 22 to 8 seconds on depsolving of a default install
with a test case on my laptop.
(_provideToPkg): Return what we find for the dep
instead of requiring an additional dictionary lookup
(resolveDeps): Only run dep check on packages we haven't looped
across before. Otherwise, we waste time looking things up that
we've done before.
(tsCheck): Look for only the specified. Speed up relationship
adding with a short-circuit so that we don't always loop over the
full list.
Diffstat (limited to 'yuminstall.py')
-rw-r--r-- | yuminstall.py | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/yuminstall.py b/yuminstall.py index 4701061f3..6b51fcf66 100644 --- a/yuminstall.py +++ b/yuminstall.py @@ -264,52 +264,50 @@ class YumSorter(yum.YumBase): # have something which requires kernel if self.tsInfo.getMembers(po.pkgtup): self.deps[req] = po - return + return po if po.name not in satisfiers: satisfiers.append(po) if satisfiers: best = self.bestPackagesFromList(satisfiers)[0] self.deps[req] = best - # raise resolution error + return best + return None def resolveDeps(self): CheckDeps = 1 if self.dsCallback: self.dsCallback.start() - while CheckDeps > 0: - if self.dsCallback: - self.dsCallback.tscheck(len(self.tsInfo.getMembers())) - unresolved = self.tsCheck() - CheckDeps = len(unresolved) + unresolved = self.tsInfo.getMembers() + while len(unresolved) > 0: + if self.dsCallback: self.dsCallback.tscheck(len(unresolved)) + unresolved = self.tsCheck(unresolved) if self.dsCallback: self.dsCallback.restartLoop() return (2, ['Success - deps resolved']) - def tsCheck(self): + def tsCheck(self, tocheck): unresolved = [] - for txmbr in self.tsInfo.getMembers(): + for txmbr in tocheck: if self.dsCallback: self.dsCallback.pkgAdded() if txmbr.output_state not in TS_INSTALL_STATES: continue 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: - log.warning("Unresolvable dependancy %s in %s" %(req[0], txmbr.name)) -# raise yum.Errors.DepError, "Unresolvable dependancy %s in %s" % (req[0], txmbr.name) + dep = self.deps.get(req, None) + if dep is None: + dep = self._provideToPkg(req) + if dep is None: + log.warning("Unresolvable dependancy %s in %s" + %(req[0], txmbr.name)) + continue # Skip filebased requires on self, etc if txmbr.name == dep.name: @@ -318,21 +316,23 @@ class YumSorter(yum.YumBase): if "%s>%s" % (dep.name, txmbr.name) in self.whiteout: log.debug("ignoring %s>%s in whiteout" %(dep.name, txmbr.name)) 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.bestPackagesFromList(pkgs)[0] 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: + unresolved.append(member) + + #Add relationship + found = False + for (tup, rel) in txmbr.relatedto: + if member.po.pkgtup == tup: + found = True + break + if not found: txmbr.setAsDep(member.po) + print "number of cached is: %s, unresolved: %s" %(len(self.deps.keys()),len(unresolved)) return unresolved def doTsSetup(self): |