-# Gentoo metadata xml and arch keyword checking tool.
-
-import os
-import sys
-import re
-from stat import *
-from xml.sax import saxutils, make_parser, handler
-from xml.sax.handler import feature_namespaces
-
-import portage
-from portage.output import *
-
-__version__ = "svn"
-
-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)))
-
- slot_list = []
-
- for pkg in ebuildlist:
- portdb = portage.portdbapi(portdir)
- aux = portdb.aux_get(workdir.rsplit("/")[-2] + "/" + pkg, ['SLOT', 'KEYWORDS'])
-
- slot = aux[0]
- keywords = keywords = re.split(' ',aux[1])
-
- if not slot in slot_list:
- slot_list.append(slot)
-
- for arch in keywords:
- if arch in archdict:
- archdict[arch].append((pkg, slot))
- else:
- archdict[arch] = [ (pkg, slot) ]
-
- archlist = archdict.keys();
- archlist.sort()
-
- slot_list.sort()
-
- for slot in slot_list:
- visible_stable = {}
- visible_unstable = {}
-
- for arch in archlist:
- visible_stable[arch] = None
- visible_unstable[arch] = None
-
- for pkg in ebuildlist:
- for arch in archlist:
- if (arch and (pkg, slot) in archdict[arch]):
- if arch[0] == "-":
- pass
- elif "~" == arch[0]:
- visible_unstable[arch] = pkg
- else:
- visible_unstable["~" + arch] = None
- visible_stable[arch] = pkg
-
- for pkg in ebuildlist:
- found = False
- for arch in archlist:
- if (pkg, slot) in archdict[arch]:
- found = True
-
- if not found:
- continue
-
- if not pkg == ebuildlist[0]:
- print ""
-
- print darkgreen("Keywords: ") + pkg + "[" + slot + "]:",
-
- for arch in archlist:
- if (arch and (pkg, slot) in archdict[arch]):
- if arch[0] == "-":
- print red(arch),
- elif "~" == arch[0]:
- if visible_unstable[arch] == pkg:
- print blue(arch),
- else:
- if visible_stable[arch] == pkg:
- print green(arch),
-
-
-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.append(contents)
-
- if self._inside_longdescription == "Yes":
- self._longdescription = contents
-
- if self._inside_maintainer=="Yes" and self._inside_email=="Yes":
- self._maintainers.append(contents)