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
|
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):
for s in os.listdir(self.distsdir):
if not filter:
yield s
else:
try:
filter.index(s)
yield s
except:
pass
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')
for ent in sorted(deb822.Sources.iter_paragraphs(GzipFile(sfile)), key=k):
if not filter:
yield SourcePackage(ent)
else:
try:
filter.index(ent['Package'])
yield SourcePackage(ent)
except:
pass
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):
self.pkgs.sort()
for k,v in self.pkgs.iteritems():
yield (k,v)
|