From 68dc4e6bdbb5c9a5295554907732945949ff674c Mon Sep 17 00:00:00 2001 From: solar Date: Sun, 4 Feb 2007 22:14:10 +0000 Subject: [PATCH] - initial import of epkginfo svn path=/; revision=343 --- trunk/src/epkginfo/epkginfo | 199 ++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100755 trunk/src/epkginfo/epkginfo diff --git a/trunk/src/epkginfo/epkginfo b/trunk/src/epkginfo/epkginfo new file mode 100755 index 0000000..f3598bf --- /dev/null +++ b/trunk/src/epkginfo/epkginfo @@ -0,0 +1,199 @@ +#!/usr/bin/python + +############################################################################## +# $Header: $ +############################################################################## +# Distributed under the terms of the GNU General Public License, v2 or later +# Author: Ned Ludd (glue all the parts together) +# Author: Eldad Zack (earch) +# Author : Eric Olinger (metadata) + +# Gentoo metadata xml and arch keyword checking tool. + +import os,sys,portage +import string,re +from stat import * +from output import * +from xml.sax import saxutils, make_parser, handler +from xml.sax.handler import feature_namespaces + +#sys.path.insert(0, "/usr/lib/portage/pym") + +version="0.4.1" + +def getvar(pkg, var): + file = open(pkg + ".ebuild") + for line in file.readlines(): + line = string.rstrip(line) + if re.match("^"+var+"=",line): + vars = re.split("\"",line)[1] + file.close + return re.split(" ",vars) + file.close + +def earch(workdir): + """Prints arch keywords for a given dir""" + portdir = portage.settings["PORTDIR"] + #workdir = "." + os.chdir(workdir) + + archdict = {} + ebuildlist = [] + for file in os.listdir(workdir): + if re.search("\.ebuild$",file): + ebuildlist.append(re.split("\.ebuild$",file)[0]) + + ebuildlist.sort(lambda x,y: portage.pkgcmp(portage.pkgsplit(x),portage.pkgsplit(y))) + + for pkg in ebuildlist: + keywords = getvar(pkg, "KEYWORDS") + for arch in keywords: + archdict[arch] = pkg + + for pkg in ebuildlist: + print darkgreen("Keywords: ") + pkg + ": ", + for value,key in archdict.iteritems(): + if (key == pkg): + if value[0] == "-": + print red(value), + elif "~" == value[0]: + print blue(value), + else: + print green(value), + print "" + + +class Metadata_XML(handler.ContentHandler): + _inside_herd="No" + _inside_maintainer="No" + _inside_email="No" + _inside_longdescription="No" + + _herd = "" + _maintainers = [] + _longdescription = "" + + def startElement(self, tag, attr): + if tag == "herd": + self._inside_herd="Yes" + if tag == "longdescription": + self._inside_longdescription="Yes" + if tag == "maintainer": + self._inside_maintainer="Yes" + if tag == "email": + self._inside_email="Yes" + + def endElement(self, tag): + if tag == "herd": + self._inside_herd="No" + if tag == "longdescription": + self._inside_longdescription="No" + if tag == "maintainer": + self._inside_maintainer="No" + if tag == "email": + self._inside_email="No" + + def characters(self, contents): + if self._inside_herd == "Yes": + self._herd = contents + + if self._inside_longdescription == "Yes": + self._longdescription = contents + + if self._inside_maintainer=="Yes" and self._inside_email=="Yes": + self._maintainers.append(contents) + + +def check_metadata(full_package): + """Checks that the primary maintainer is still an active dev and list the hed the package belongs to""" + metadata_file=portage.settings["PORTDIR"] + "/" + portage.pkgsplit(full_package)[0] + "/metadata.xml" + if not os.path.exists(metadata_file): + print darkgreen("Maintainer: ") + red("Error (Missing metadata.xml)") + return 1 + + parser = make_parser() + handler = Metadata_XML() + handler._maintainers = [] + parser.setContentHandler(handler) + parser.parse( metadata_file ) + + if len(handler._herd) < 1: + print darkgreen("Herd: ") + red("Error (No Herd)") + return 1 + else: + print darkgreen("Herd: ") + handler._herd + + if len(handler._maintainers) < 1: + print darkgreen("Maintainer: ") + handler._herd + else: + print darkgreen("Maintainer: ") + ", ".join(handler._maintainers) + + if len(handler._longdescription) > 1: + print darkgreen("Description: ") + handler._longdescription + print darkgreen("Location: ") + os.path.normpath(portage.settings["PORTDIR"] + "/" + portage.pkgsplit(full_package)[0]) + + +def usage(code): + """Prints the uage information for this script""" + print green("epkginfo v" + version + "\n") + print "Usage: epkginfo [package-cat/]package" + sys.exit(code) + + +# default color setup +if ( not sys.stdout.isatty() ) or ( portage.settings["NOCOLOR"] in ["yes","true"] ): + nocolor() + +def fc(x,y): + return cmp(y[0], x[0]) + + +def grab_changelog_devs(catpkg): + try: + os.chdir(portage.settings["PORTDIR"] + "/" + catpkg) + foo="" + r=re.compile("<[^@]+@gentoo.org>", re.I) + s="\n".join(portage.grabfile("ChangeLog")) + d={} + for x in r.findall(s): + if x not in d: + d[x] = 0 + d[x] += 1 + + l=[(d[x], x) for x in d.keys()] + #l.sort(lambda x,y: cmp(y[0], x[0])) + l.sort(fc) + for x in l: + p = str(x[0]) +" "+ x[1].lstrip("<").rstrip(">") + foo += p[:p.find("@")]+", " + return foo + except: + raise + +def main (): + if len( sys.argv ) < 2: + usage(1) + + for pkg in sys.argv[1:]: + + if sys.argv[1:][:1] == "-": + print "NOT WORKING?=="+sys.argv[1:] + continue + + try: + package_list = portage.portdb.xmatch("match-all", pkg) + if package_list: + + catpkg = portage.pkgsplit(package_list[0])[0] + + print darkgreen("Package: ") + catpkg + check_metadata(package_list[0]) + earch(portage.settings["PORTDIR"] + "/" + catpkg) + #print darkgreen("ChangeLog: ") + grab_changelog_devs(catpkg) + print "" + except: + print red("Error: "+pkg+"\n") + + +if __name__ == '__main__': + main() -- 2.26.2