[yum-cvs] yum-utils repoquery.py,NONE,1.1
Gijs Hollestelle
gijs at login.linux.duke.edu
Tue Mar 22 19:26:06 UTC 2005
Update of /home/groups/yum/cvs/yum-utils
In directory login:/tmp/cvs-serv7551
Added Files:
repoquery.py
Log Message:
Adding initial versions of updateonboot and repoquery scripts
--- NEW FILE repoquery.py ---
#!/usr/bin/python -tt
# repoquery 0.0.5
# Licensed under the GPL
# by pmatilai at welho.com
import sys
import signal
import re
import fnmatch
import time
from optparse import OptionParser
import yum
import yum.config
flags = { 'EQ':'=', 'LT':'<', 'LE':'<=', 'GT':'>', 'GE':'>=', 'None':' '}
std_qf = {
'nvr': '%{name}-%{version}-%{release}',
'nevra': '%{name}-%{epoch}:%{version}-%{release}.%{arch}',
'info': """
Name : %{name}
Version : %{version}
Release : %{release}
Architecture: %{arch}
Size : %{installedsize}
Packager : %{packager}
Group : %{group}
URL : %{url}
Repository : %{repoid}
Summary : %{summary}
Description :\n%{description}""",
}
def rpmevr(e, v, r):
et = ""
vt = ""
rt = ""
if e and e != "0":
et = "%s:" % e
if v:
vt = "%s" % v
if r:
rt = "-%s" % r
return "%s%s%s" % (et, vt, rt)
# Runtime extensions to YumAvailablePackage class
def pkgGetitem(self, item):
res = None
try:
res = self.returnSimple(item)
except KeyError:
if item == "license":
res = " ".join(self.licenses)
return res
def pkgDoQuery(self, method, *args, **kw):
if std_qf.has_key(method):
self.qf = std_qf[method]
return self.queryformat()
else:
return getattr(self, method)(*args, **kw)
def pkgPrco(self, what, **kw):
rpdict = {}
for rptup in self.returnPrco(what):
(rpn, rpf, (rp,rpv,rpr)) = rptup
# rpmlib deps should be handled on their own
if rpn[:6] == 'rpmlib':
continue
if rpf:
rpdict["%s %s %s" % (rpn, flags[rpf], rpmevr(rp,rpv,rpr))] = None
else:
rpdict[rpn] = None
return rpdict.keys()
# these return formatted strings, not lists..
def fmtQueryformat(self):
if not self.qf:
qf = std_qf["nevra"]
else:
qf = self.qf
qf = qf.replace("\\n", "\n")
pattern = re.compile('%{(\w*?)}')
fmt = re.sub(pattern, r'%(\1)s', qf)
return fmt % self
def fmtList(self, **kw):
fdict = {}
for file in self.returnFileEntries():
fdict[file] = None
files = fdict.keys()
files.sort()
return "\n".join(files)
def fmtChangelog(self, **kw):
changelog = []
for date, author, message in self.returnChangelog():
changelog.append("* %s %s\n%s\n" % (time.ctime(int(date)), author, message))
return "\n".join(changelog)
def fmtObsoletes(self, **kw):
return "\n".join(self._prco("obsoletes"))
def fmtProvides(self, **kw):
return "\n".join(self._prco("provides", **kw))
def fmtRequires(self, **kw):
return "\n".join(self._prco("requires", **kw))
def fmtConflicts(self, **kw):
return "\n".join(self._prco("conflicts", **kw))
class YumBaseQuery(yum.YumBase):
def __init__(self, pkgops = [], sackops = [], options = None):
yum.YumBase.__init__(self)
self.conf = yum.config.yumconf()
self.options = options
self.pkgops = pkgops
self.sackops = sackops
def extendPkgClass(self):
setattr(self.pkgSack.pc, "__getitem__", pkgGetitem)
setattr(self.pkgSack.pc, "__str__", fmtQueryformat)
setattr(self.pkgSack.pc, "__repr__", fmtQueryformat)
setattr(self.pkgSack.pc, "_prco", pkgPrco)
setattr(self.pkgSack.pc, "doQuery", pkgDoQuery)
setattr(self.pkgSack.pc, "queryformat", fmtQueryformat)
setattr(self.pkgSack.pc, "list", fmtList)
setattr(self.pkgSack.pc, "requires", fmtRequires)
setattr(self.pkgSack.pc, "provides", fmtProvides)
setattr(self.pkgSack.pc, "conflicts", fmtConflicts)
setattr(self.pkgSack.pc, "obsoletes", fmtObsoletes)
# XXX there's already "changelog" attribute in pkg class
setattr(self.pkgSack.pc, "xchangelog", fmtChangelog)
qf = self.options.queryformat or std_qf["nevra"]
setattr(self.pkgSack.pc, "qf", qf)
def doRepoSetup(self):
for repo in self.repos.listEnabled():
if repo.repoXML is not None:
continue
repo.cache = 1
repo.dirSetup()
repo.getRepoXML()
repo.baseurlSetup()
# yumbase has an abstract log method
def log(self, level, message):
pass
def matchPkgs(self, regexs):
if not regexs:
return self.pkgSack.returnNewestByNameArch()
pkgs = []
for pkg in self.pkgSack.returnNewestByNameArch():
for expr in regexs:
if pkg.name == expr or fnmatch.fnmatch("%s" % pkg, expr):
pkgs.append(pkg)
return pkgs
def runQuery(self, items):
pkgs = self.matchPkgs(items)
for pkg in pkgs:
for oper in self.pkgops:
print pkg.doQuery(oper)
for prco in items:
for oper in self.sackops:
for p in self.doQuery(oper, prco): print p
def doQuery(self, method, *args, **kw):
return getattr(self, method)(*args, **kw)
def whatprovides(self, name, **kw):
return [self.returnPackageByDep(name)]
def whatrequires(self, name, **kw):
pkgs = []
provs = [name]
if self.options.alldeps:
for pkg in self.pkgSack.returnNewestByName(name):
provs.extend(pkg._prco("provides"))
for prov in provs:
for pkg in self.pkgSack.searchRequires(prov):
pkgs.append(pkg)
return pkgs
def requires(self, name, **kw):
pkgs = {}
for pkg in self.pkgSack.returnNewestByName(name):
for req in pkg._prco("requires"):
for res in self.whatprovides(req):
pkgs[res.name] = res
return pkgs.values()
def location(self, name):
loc = []
for pkg in self.pkgSack.returnNewestByName(name):
repo = self.repos.getRepo(pkg.simple['repoid'])
loc.append("%s/%s" % (repo.urls[0], pkg['relativepath']))
return loc
def main(args):
needfiles = 0
needother = 0
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
signal.signal(signal.SIGINT, signal.SIG_DFL)
parser = OptionParser()
# query options
parser.add_option("--requires", default=0, action="store_true")
parser.add_option("--provides", default=0, action="store_true")
parser.add_option("--whatprovides", default=0, action="store_true")
parser.add_option("--whatrequires", default=0, action="store_true")
parser.add_option("--obsoletes", default=0, action="store_true")
parser.add_option("--conflicts", default=0, action="store_true")
parser.add_option("--changelog", default=0, action="store_true")
parser.add_option("--location", default=0, action="store_true")
parser.add_option("--nevra", default=0, action="store_true")
parser.add_option("--nvr", default=0, action="store_true")
parser.add_option("-s", "--source", default=0, action="store_true")
parser.add_option("--resolve", default=0, action="store_true")
parser.add_option("--alldeps", default=0, action="store_true")
parser.add_option("-l", "--list", default=0, action="store_true")
parser.add_option("-i", "--info", default=0, action="store_true")
parser.add_option("--qf", "--queryformat", dest="queryformat")
parser.add_option("--range", default=":", dest="range")
# dummy for rpmq compatibility
parser.add_option("-q", "--query", default=0, action="store_true")
parser.add_option("-a", "--all", default=0, action="store_true")
(opts, regexs) = parser.parse_args()
if len(regexs) < 1 and not opts.all:
parser.print_help()
sys.exit(0)
pkgops = []
sackops = []
archlist = None
if opts.queryformat:
pkgops.append("queryformat")
if opts.requires:
if opts.resolve:
sackops.append("requires")
else:
pkgops.append("requires")
if opts.provides:
pkgops.append("provides")
if opts.obsoletes:
pkgops.append("obsoletes")
if opts.conflicts:
pkgops.append("conflicts")
if opts.changelog:
needother = 1
pkgops.append("xchangelog")
if opts.list:
needfiles = 1
pkgops.append("list")
if opts.info:
pkgops.append("info")
if opts.nvr:
pkgops.append("nvr")
if opts.source:
archlist = ['src']
if opts.whatrequires:
sackops.append("whatrequires")
if opts.whatprovides:
sackops.append("whatprovides")
if opts.location:
sackops.append("location")
if opts.nevra or (len(pkgops) == 0 and len(sackops) == 0):
pkgops.append("nevra")
repoq = YumBaseQuery(pkgops, sackops, opts)
repoq.doConfigSetup()
repoq.doRepoSetup()
repoq.doSackSetup(archlist=archlist)
if needfiles:
repoq.repos.populateSack(with='filelists')
if needother:
repoq.repos.populateSack(with='otherdata')
repoq.extendPkgClass()
repoq.runQuery(regexs)
if __name__ == "__main__":
main(sys.argv)
# vim:sw=4:sts=4:expandtab
More information about the Yum-cvs-commits
mailing list