summaryrefslogtreecommitdiff
path: root/patchtracker/SourceArchive.py
blob: a0aab1b14e368d52c341e24d7bb30a974888f215 (plain)
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)