2 ##############################################################################
4 ##############################################################################
5 # Distributed under the terms of the GNU General Public License, v2 or later
6 # Author: Ned Ludd <solar@gentoo.org> (glue all the parts together)
7 # Author: Eldad Zack <eldad@gentoo.org> (earch)
8 # Author : Eric Olinger <EvvL AT RustedHalo DOT net> (metadata)
10 # Gentoo metadata xml and arch keyword checking tool.
16 from xml.sax import saxutils, make_parser, handler
17 from xml.sax.handler import feature_namespaces
20 from portage.output import *
25 """Prints arch keywords for a given dir"""
26 portdir = portage.settings["PORTDIR"]
32 for file in os.listdir(workdir):
33 if re.search("\.ebuild$",file):
34 ebuildlist.append(re.split("\.ebuild$",file)[0])
36 ebuildlist.sort(lambda x,y: portage.pkgcmp(portage.pkgsplit(x),portage.pkgsplit(y)))
40 for pkg in ebuildlist:
41 portdb = portage.portdbapi(portdir)
42 aux = portdb.aux_get(workdir.rsplit("/")[-2] + "/" + pkg, ['SLOT', 'KEYWORDS'])
45 keywords = keywords = re.split(' ',aux[1])
47 if not slot in slot_list:
48 slot_list.append(slot)
52 archdict[arch].append((pkg, slot))
54 archdict[arch] = [ (pkg, slot) ]
56 archlist = archdict.keys();
61 for slot in slot_list:
66 visible_stable[arch] = None
67 visible_unstable[arch] = None
69 for pkg in ebuildlist:
71 if (arch and (pkg, slot) in archdict[arch]):
75 visible_unstable[arch] = pkg
77 visible_unstable["~" + arch] = None
78 visible_stable[arch] = pkg
80 for pkg in ebuildlist:
83 if (pkg, slot) in archdict[arch]:
89 if not pkg == ebuildlist[0]:
92 print darkgreen("Keywords: ") + pkg + "[" + slot + "]:",
95 if (arch and (pkg, slot) in archdict[arch]):
99 if visible_unstable[arch] == pkg:
102 if visible_stable[arch] == pkg:
106 class Metadata_XML(handler.ContentHandler):
108 _inside_maintainer="No"
110 _inside_longdescription="No"
114 _longdescription = ""
116 def startElement(self, tag, attr):
118 self._inside_herd="Yes"
119 if tag == "longdescription":
120 self._inside_longdescription="Yes"
121 if tag == "maintainer":
122 self._inside_maintainer="Yes"
124 self._inside_email="Yes"
126 def endElement(self, tag):
128 self._inside_herd="No"
129 if tag == "longdescription":
130 self._inside_longdescription="No"
131 if tag == "maintainer":
132 self._inside_maintainer="No"
134 self._inside_email="No"
136 def characters(self, contents):
137 if self._inside_herd == "Yes":
138 self._herd.append(contents)
140 if self._inside_longdescription == "Yes":
141 self._longdescription = contents
143 if self._inside_maintainer=="Yes" and self._inside_email=="Yes":
144 self._maintainers.append(contents)
147 def check_metadata(full_package):
148 """Checks that the primary maintainer is still an active dev and list the herd the package belongs to"""
149 metadata_file=portage.settings["PORTDIR"] + "/" + portage.pkgsplit(full_package)[0] + "/metadata.xml"
150 if not os.path.exists(metadata_file):
151 print darkgreen("Maintainer: ") + red("Error (Missing metadata.xml)")
154 parser = make_parser()
155 handler = Metadata_XML()
156 handler._maintainers = []
157 parser.setContentHandler(handler)
158 parser.parse( metadata_file )
161 herds = ", ".join(handler._herd)
162 print darkgreen("Herd: ") + herds
164 print darkgreen("Herd: ") + red("Error (No Herd)")
168 if handler._maintainers:
169 print darkgreen("Maintainer: ") + ", ".join(handler._maintainers)
171 print darkgreen("Maintainer: ") + "none"
173 if len(handler._longdescription) > 1:
174 print darkgreen("Description: ") + handler._longdescription
175 print darkgreen("Location: ") + os.path.normpath(portage.settings["PORTDIR"] + "/" + portage.pkgsplit(full_package)[0])
179 """Prints the uage information for this script"""
180 print green("epkginfo"), "(%s)" % __version__
182 print "Usage: epkginfo [package-cat/]package"
186 # default color setup
187 if ( not sys.stdout.isatty() ) or ( portage.settings["NOCOLOR"] in ["yes","true"] ):
191 return cmp(y[0], x[0])
194 def grab_changelog_devs(catpkg):
196 os.chdir(portage.settings["PORTDIR"] + "/" + catpkg)
198 r=re.compile("<[^@]+@gentoo.org>", re.I)
199 s="\n".join(portage.grabfile("ChangeLog"))
201 for x in r.findall(s):
206 l=[(d[x], x) for x in d.keys()]
207 #l.sort(lambda x,y: cmp(y[0], x[0]))
210 p = str(x[0]) +" "+ x[1].lstrip("<").rstrip(">")
211 foo += p[:p.find("@")]+", "
217 if len( sys.argv ) < 2:
220 for pkg in sys.argv[1:]:
222 if sys.argv[1:][:1] == "-":
223 print "NOT WORKING?=="+sys.argv[1:]
227 package_list = portage.portdb.xmatch("match-all", pkg)
230 catpkg = portage.pkgsplit(package_list[0])[0]
232 print darkgreen("Package: ") + catpkg
233 check_metadata(package_list[0])
234 earch(portage.settings["PORTDIR"] + "/" + catpkg)
235 #print darkgreen("ChangeLog: ") + grab_changelog_devs(catpkg)
238 print "!!! No package '%s'" % pkg
240 print red("Error: "+pkg+"\n")
243 if __name__ == '__main__':