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
|
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
class SourcePackage:
name = None
format = None
diffgz = None
loc = None
type = "Native"
version = None
# todo
vcs = {}
def __init__(self, info):
self.name = info['Package']
self.format = info['Format']
self.loc = info['Directory']
self.version = info['Version']
for f in info['Files']:
if fnmatch(f['name'], '*.diff.gz'):
self.diffgz=f
self.type = "Debian-diff"
def idx(self):
name = str(self)
if len(name) < 4 or name[0:3] != "lib":
return name[0]
else:
return name[0:4]
def __str__(self):
return self.name
class SourcePackageIndex:
def __init__(self):
self.pkgs = {}
def ins(self, srcpkg, rel):
idx = srcpkg.idx()
if not self.pkgs.has_key(idx):
self.pkgs[idx] = {}
if not self.pkgs[idx].has_key(srcpkg.name):
self.pkgs[idx][srcpkg.name] = {}
if not self.pkgs[idx][srcpkg.name].has_key(rel):
self.pkgs[idx][srcpkg.name][rel] = srcpkg
def indices(self):
for k,v in sorted(self.pkgs.iteritems()):
yield (k,v)
|