[Yum-devel] [PATCH] add --lookaside switch for depsolving against a repo without depsolving the repo itself
Dennis Gregorovic
dgregor at redhat.com
Tue Aug 3 15:42:55 UTC 2010
---
repoclosure.py | 99 ++++++++++++++++++++++++++++++-------------------------
1 files changed, 54 insertions(+), 45 deletions(-)
diff --git a/repoclosure.py b/repoclosure.py
index 88a6adb..edf2f96 100755
--- a/repoclosure.py
+++ b/repoclosure.py
@@ -16,9 +16,9 @@
# seth vidal 2005 (c) etc etc
-#Read in the metadata of a series of repositories and check all the
-# dependencies in all packages for resolution. Print out the list of
-# packages with unresolved dependencies
+# Read in the metadata of a series of repositories and check all the
+# dependencies in all packages for resolution. Print out the list of
+# packages with unresolved dependencies
import sys
import os
@@ -35,11 +35,11 @@ from yum.packageSack import ListPackageSack
def parseArgs():
usage = """
- Read in the metadata of a series of repositories and check all the
+ Read in the metadata of a series of repositories and check all the
dependencies in all packages for resolution. Print out the list of
packages with unresolved dependencies
-
- %s [-c <config file>] [-a <arch>] [-r <repoid>] [-r <repoid2>]
+
+ %s [-c <config file>] [-a <arch>] [-l <lookaside>] [-r <repoid>] [-r <repoid2>]
""" % sys.argv[0]
parser = OptionParser(usage=usage)
parser.add_option("-c", "--config", default='/etc/yum.conf',
@@ -47,15 +47,17 @@ def parseArgs():
parser.add_option("-a", "--arch", default=[], action='append',
help='check packages of the given archs, can be specified multiple ' +
'times (default: current arch)')
- parser.add_option("--basearch", default=None,
+ parser.add_option("--basearch", default=None,
help="set the basearch for yum to run as")
parser.add_option("-b", "--builddeps", default=False, action="store_true",
help='check build dependencies only (needs source repos enabled)')
+ parser.add_option("-l", "--lookaside", default=[], action='append',
+ help="specify a lookaside repo id to query, can be specified multiple times")
parser.add_option("-r", "--repoid", default=[], action='append',
help="specify repo ids to query, can be specified multiple times (default is all enabled)")
- parser.add_option("-t", "--tempcache", default=False, action="store_true",
+ parser.add_option("-t", "--tempcache", default=False, action="store_true",
help="Use a temp dir for storing/accessing yum-cache")
- parser.add_option("-q", "--quiet", default=0, action="store_true",
+ parser.add_option("-q", "--quiet", default=0, action="store_true",
help="quiet (no output to stderr)")
parser.add_option("-n", "--newest", default=0, action="store_true",
help="check only the newest packages in the repos")
@@ -77,34 +79,35 @@ class RepoClosure(yum.YumBase):
if basearch:
self.preconf.arch = basearch
self.logger = logging.getLogger("yum.verbose.repoclosure")
+ self.lookaside = []
self.builddeps = builddeps
self.pkgonly = pkgonly
self.grouponly = grouponly
- self.doConfigSetup(fn = config,init_plugins=False)
+ self.doConfigSetup(fn=config, init_plugins=False)
self._rc_arches = arch
if hasattr(self.repos, 'sqlite'):
self.repos.sqlite = False
self.repos._selectSackType()
-
+
def evrTupletoVer(self,tup):
"""convert and evr tuple to a version string, return None if nothing
to convert"""
-
+
e, v,r = tup
if v is None:
return None
-
+
val = v
if e is not None:
val = '%s:%s' % (e, v)
-
+
if r is not None:
val = '%s-%s' % (val, r)
-
+
return val
-
+
def readMetadata(self):
self.doRepoSetup()
archs = []
@@ -118,7 +121,7 @@ class RepoClosure(yum.YumBase):
archs.append('src')
self.doSackSetup(archs)
for repo in self.repos.listEnabled():
- self.repos.populateSack(which=[repo.id], mdtype='filelists')
+ self.repos.populateSack(which=[repo.id], mdtype='filelists')
def getBrokenDeps(self, newest=False):
unresolved = {}
@@ -128,7 +131,7 @@ class RepoClosure(yum.YumBase):
pkgs = self.pkgSack.returnNewestByNameArch()
mypkgSack = ListPackageSack(pkgs)
pkgtuplist = mypkgSack.simplePkgList()
-
+
# toss out any of the obsoleted pkgs so we can't depsolve with them
self.up = rpmUtils.updates.Updates([], pkgtuplist)
self.up.rawobsoletes = mypkgSack.returnObsoletes()
@@ -144,7 +147,7 @@ class RepoClosure(yum.YumBase):
# we've deleted items so remake the pkgs
pkgs = self.pkgSack.returnNewestByNameArch()
pkgtuplist = mypkgSack.simplePkgList()
-
+
if self.builddeps:
pkgs = filter(lambda x: x.arch == 'src', pkgs)
@@ -162,9 +165,13 @@ class RepoClosure(yum.YumBase):
pkgs = filter(lambda x: x.name in pkglist, pkgs)
for pkg in pkgs:
+ if pkg.repoid in self.lookaside:
+ # don't attempt to resolve dependancy issues for
+ # packages from lookaside repositories
+ continue
for (req, flags, (reqe, reqv, reqr)) in pkg.returnPrco('requires'):
if req.startswith('rpmlib'): continue # ignore rpmlib deps
-
+
ver = self.evrTupletoVer((reqe, reqv, reqr))
if (req,flags,ver) in resolved:
continue
@@ -172,34 +179,34 @@ class RepoClosure(yum.YumBase):
resolve_sack = self.whatProvides(req, flags, ver)
except yum.Errors.RepoError, e:
pass
-
+
if len(resolve_sack) < 1:
if pkg not in unresolved:
unresolved[pkg] = []
unresolved[pkg].append((req, flags, ver))
continue
-
+
if newest:
resolved_by_newest = False
- for po in resolve_sack:# look through and make sure all our answers are newest-only
+ for po in resolve_sack: # look through and make sure all our answers are newest-only
if po.pkgtup in pkgtuplist:
resolved_by_newest = True
break
- if resolved_by_newest:
- resolved[(req,flags,ver)] = 1
+ if resolved_by_newest:
+ resolved[(req, flags, ver)] = 1
else:
if pkg not in unresolved:
unresolved[pkg] = []
- unresolved[pkg].append((req, flags, ver))
-
+ unresolved[pkg].append((req, flags, ver))
+
return unresolved
-
+
def main():
(opts, cruft) = parseArgs()
- my = RepoClosure(arch=opts.arch,
- config=opts.config,
+ my = RepoClosure(arch=opts.arch,
+ config=opts.config,
builddeps=opts.builddeps,
pkgonly=opts.pkg,
grouponly=opts.group,
@@ -214,7 +221,7 @@ def main():
baseurl = 'file://' + repopath
else:
baseurl = repopath
-
+
newrepo = yum.yumRepo.YumRepository(repoid)
newrepo.name = repopath
newrepo.baseurl = baseurl
@@ -224,20 +231,24 @@ def main():
my.repos.add(newrepo)
my.repos.enableRepo(newrepo.id)
my.logger.info( "Added %s repo from %s" % (repoid,repopath))
-
+
if opts.repoid:
for repo in my.repos.repos.values():
- if repo.id not in opts.repoid:
+ if (repo.id not in opts.repoid) and \
+ (repo.id not in opts.lookaside):
repo.disable()
else:
repo.enable()
+ if opts.lookaside:
+ my.lookaside = opts.lookaside
+
if os.geteuid() != 0 or opts.tempcache:
cachedir = getCacheDir()
if cachedir is None:
my.logger.error("Error: Could not make cachedir, exiting")
sys.exit(50)
-
+
my.repos.setCacheDir(cachedir)
if not opts.quiet:
@@ -258,7 +269,7 @@ def main():
num = len(my.pkgSack.returnNewestByNameArch())
else:
num = len(my.pkgSack)
-
+
repos = my.repos.listEnabled()
if not opts.quiet:
@@ -266,24 +277,24 @@ def main():
for repo in repos:
my.logger.info(' %s' % repo)
my.logger.info('Num Packages in Repos: %s' % num)
-
+
pkgs = baddeps.keys()
-
- def sortbyname(a,b):
- return cmp(a.__str__(),b.__str__())
-
+
+ def sortbyname(a, b):
+ return cmp(a.__str__(), b.__str__())
+
pkgs.sort(sortbyname)
-
+
for pkg in pkgs:
my.logger.info('package: %s from %s\n unresolved deps: ' % (pkg, pkg.repoid))
for (n, f, v) in baddeps[pkg]:
req = '%s' % n
- if f:
+ if f:
flag = LETTERFLAGS[f]
req = '%s %s'% (req, flag)
if v:
req = '%s %s' % (req, v)
-
+
my.logger.info(' %s' % req)
if __name__ == "__main__":
@@ -292,5 +303,3 @@ if __name__ == "__main__":
except (yum.Errors.YumBaseError, ValueError), e:
print >> sys.stderr, str(e)
sys.exit(1)
-
-
--
1.5.5.6
More information about the Yum-devel
mailing list