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