1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
import os
import errno
from fnmatch import fnmatch
from gzip import GzipFile
from debian_bundle import deb822
from operator import itemgetter
import patchtracker.Conf as Conf
from DiffGzHandler import DiffGzHandler
class Archive:
root = None
distsdir = None
def __init__(self, dir):
self.root = dir
self.distsdir = os.sep.join([dir, "dists"])
def suites(self, filter=None):
slist = os.listdir(self.distsdir)
if filter:
slist = set(filter).intersection(set(slist))
for s in sorted(slist):
yield s
def components(self, suite):
f = file(self.distsdir + os.sep + os.sep.join([suite, "Release"]))
rel = deb822.Release(f)
for comp in rel['Components'].split(' '):
yield comp
def sourcepackages(self, suite, component, filter=None):
sfile=os.sep.join([self.distsdir,suite,component,"/source/Sources.gz"])
k = itemgetter('Package')
fdict = {}
if filter:
for name in filter:
fdict[name] = True
for ent in sorted(deb822.Sources.iter_paragraphs(GzipFile(sfile)), key=k):
if filter and not fdict.has_key(ent['Package']):
continue
else:
yield SourcePackage(ent)
def __str__(self):
return "Archive rooted at "+self.root
# XXX maybe there's a better place/way for this
def getidx(letter):
name = str(letter)
if len(name) < 4 or name[0:3] != "lib":
return name[0]
else:
return name[0:4]
class SourcePackage:
def __init__(self, info):
self.diffgz_name = None
self.diffgz_size = None
self.diffgz_md5sum = None
self.diffgz = None
self.type = "Native"
self.name = info['Package']
self.format = info['Format']
self.loc = info['Directory']
self.version = info['Version']
self.idx = getidx(self)
for f in info['Files']:
if fnmatch(f['name'], '*.diff.gz'):
self.diffgz_name=f['name']
self.diffgz_size=f['size']
self.diffgz_md5sum=f['md5sum']
self.type = "Debian-diff"
def __str__(self):
return self.name
class MasterIndex:
def __init__(self):
self.pkgcounts = {}
def add(self, name):
idx = getidx(name)
if not self.pkgcounts.has_key(idx):
self.pkgcounts[idx] = 1
else:
self.pkgcounts[idx] += 1
def indices(self):
for k,v in sorted(self.pkgcounts.iteritems()):
yield (k,v)
class SourcePackageIndex:
def __init__(self):
self.pkgs = {}
def ins(self, srcpkg, rel):
if not self.pkgs.has_key(srcpkg.idx):
self.pkgs[srcpkg.idx] = {}
if not self.pkgs[srcpkg.idx].has_key(srcpkg.name):
self.pkgs[srcpkg.idx][srcpkg.name] = {}
if not self.pkgs[srcpkg.idx][srcpkg.name].has_key(rel):
self.pkgs[srcpkg.idx][srcpkg.name][rel] = srcpkg
def getletter(self, letter):
return self.pkgs[getidx(letter)]
def indices(self):
for k,v in sorted(self.pkgs.iteritems()):
yield (k,v)
|