| 18 |
# along with this program; if not, write to the Free Software |
# along with this program; if not, write to the Free Software |
| 19 |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 20 |
|
|
| 21 |
import os, sys, bsddb |
import os, sys, bsddb, sets |
| 22 |
import apt_pkg |
import apt_pkg |
| 23 |
|
|
| 24 |
carnivore = bsddb.btopen("/org/qa.debian.org/data/carnivore/result.db", "r") |
carnivore = bsddb.btopen("/org/qa.debian.org/data/carnivore/result.db", "r") |
| 26 |
def join(sep, items): |
def join(sep, items): |
| 27 |
return reduce(lambda a, b: a+sep+b, items) |
return reduce(lambda a, b: a+sep+b, items) |
| 28 |
|
|
| 29 |
def get(key): |
class carnivoreEntry: |
| 30 |
|
def __init__(self, v): |
| 31 |
|
if not isinstance(v, tuple): |
| 32 |
|
raise "Not a carnivore typle" |
| 33 |
|
|
| 34 |
|
(self.ldap, self.realname, self.email, self.package) = [], [], [], [] |
| 35 |
|
(self.extra, self.expl, self.warnings, self.mia) = [], [], [], [] |
| 36 |
|
self.gecos = "" |
| 37 |
|
self.keyring = {'keyring': [], 'emeritus': [], 'removed': [], 'ldap': []} |
| 38 |
|
for item in sets.Set(v[1]+v[2]): |
| 39 |
|
if item.startswith("ldap:"): |
| 40 |
|
self.ldap.append(item[5:]) |
| 41 |
|
elif item.startswith("email:"): |
| 42 |
|
self.email.append(item[6:]) |
| 43 |
|
elif item.startswith("realname:"): |
| 44 |
|
self.realname.append(item[9:]) |
| 45 |
|
elif item.startswith("maint:"): |
| 46 |
|
self.package.append(item[6:]) |
| 47 |
|
elif item.startswith("x:"): |
| 48 |
|
self.expl.append(item[2:]) |
| 49 |
|
if item.startswith("x:ldap:gpg:"): |
| 50 |
|
self.keyring['ldap'].append(item[11:].split(':')[1]) |
| 51 |
|
if item.startswith("x:gpg:keyring:"): |
| 52 |
|
gpg, ring = item[14:].split(':') |
| 53 |
|
self.keyring[ring].append(gpg) |
| 54 |
|
if item.startswith("x:ldap:realname:"): |
| 55 |
|
self.gecos = item[16:].split(':')[1] |
| 56 |
|
else: |
| 57 |
|
self.extra.append(item) |
| 58 |
|
for ring in self.keyring.values(): ring.sort() |
| 59 |
|
|
| 60 |
|
def getPrettyprintedText(self): |
| 61 |
|
text = "" |
| 62 |
|
if self.ldap: text += "DD: "+self.gecos+" <"+self.ldap[0]+"@debian.org>\n" |
| 63 |
|
if self.realname: text += "Known as: "+", ".join(self.realname)+"\n" |
| 64 |
|
if self.email: text += "Using emails: "+", ".join(self.email)+"\n" |
| 65 |
|
for k, v in self.keyring.iteritems(): |
| 66 |
|
for key in v: |
| 67 |
|
text += "Key in "+k+": "+key+"\n" |
| 68 |
|
p = "0" |
| 69 |
|
if self.package and len(self.package) <= 5: |
| 70 |
|
p = "%s (%s)" % (len(self.package), ", ".join(self.package)) |
| 71 |
|
elif self.package: |
| 72 |
|
p = "%s (%s)" % (len(self.package), ", ".join(self.package[:4]+["..."])) |
| 73 |
|
text += "Packages: %s\n" % p |
| 74 |
|
return text |
| 75 |
|
|
| 76 |
|
def search(key): |
| 77 |
if not carnivore.has_key(key): |
if not carnivore.has_key(key): |
| 78 |
return None |
return [] |
| 79 |
while 1: |
while 1: |
| 80 |
|
lastkey = key |
| 81 |
key = carnivore[key] |
key = carnivore[key] |
| 82 |
if key[0] in ["(", "["]: |
if key[0] == "(": |
| 83 |
|
return [lastkey] |
| 84 |
|
elif key[0] == "[": |
| 85 |
return eval(key) |
return eval(key) |
| 86 |
|
|
| 87 |
|
def get(key): |
| 88 |
|
while 1: |
| 89 |
|
key = carnivore[key] |
| 90 |
|
if key[0] == "(": |
| 91 |
|
return carnivoreEntry(eval(key)) |
| 92 |
|
elif key[0] == "[": |
| 93 |
|
raise "%s is not an id of a real carnivore entry" % key |
| 94 |
|
|
| 95 |
class iteritems: |
class iteritems: |
| 96 |
def __init__(this): |
def __init__(this): |
| 97 |
this.iter = carnivore.iteritems() |
this.iter = carnivore.iteritems() |
| 100 |
while 1: |
while 1: |
| 101 |
key, val = this.iter.next() |
key, val = this.iter.next() |
| 102 |
if val[0] == '(': |
if val[0] == '(': |
| 103 |
return key, eval(val) |
return key, carnivoreEntry(eval(val)) |
| 104 |
|
|
| 105 |
# vim: et |
# vim: et |