4 from ConfigParser import SafeConfigParser
8 class DebianPkgArchive(SafeConfigParser):
11 def __init__(self, dists):
15 List of Release file URLs, one for each distribution in the archive.
17 SafeConfigParser.__init__(self)
20 filename, ignored = urllib.urlretrieve(dist)
21 baseurl = '/'.join(dist.split('/')[:-1])
22 self._parseDistribution(filename, baseurl)
27 """Generate INI file content for current content.
29 # make adaptor to use str as file-like (needed for ConfigParser.write()
30 class file2str(object):
44 def save(self, filename):
45 """Write current content to a file.
47 f = open(filename, 'w')
52 def ensureUnique(self, section, option, value):
53 if not self.has_option(section, option):
54 self.set(section, option, value)
56 if not self.get(section, option) == value:
57 raise ValueError, "%s: %s is not unique (%s != %s)" \
59 self.get(section, option), value)
62 def appendUniqueCSV(self, section, option, value):
65 if not self.has_option(section, option):
66 self.set(section, option, value)
68 l = self.get(section, option).split(', ')
70 self.set(section, option, ', '.join(l + [value]))
73 def _parseDistribution(self, rfile, baseurl):
77 Release file for the distribution
79 Base URL of this distribution. This path contains the Release file.
81 # create parser instance
82 rparser = ap.ParseTagFile(open(rfile, 'r'))
83 # get release section content
86 # architectures on this dist
87 archs = rparser.Section['Architectures'].split()
88 components = rparser.Section['Components'].split()
89 codename = rparser.Section['Codename']
91 # compile the list of Packages files to parse and parse them
95 pkgsurl = '/'.join([baseurl, c, 'binary-' + a, 'Packages.gz'])
97 filename, ignored = urllib.urlretrieve(pkgsurl)
99 subprocess.call(['gzip', '-d', filename])
101 self._parsePkgsFile(filename[:-3], codename, c)
105 def _parsePkgsFile(self, pfile, codename, component):
108 pfile: Packages filename
110 Codename of the release
112 The archive component this packages file corresponds to.
114 pp = ap.ParseTagFile(open(pfile, 'r'))
118 self._storePkg(sec, codename, component)
121 def _storePkg(self, psec, codename, component):
124 psec: apt_pkg parser section
126 pkg = psec['Package']
128 if not self.has_section(pkg):
129 self.add_section(pkg)
132 self.appendUniqueCSV(pkg, "releases", codename)
135 self.appendUniqueCSV(pkg, "archs %s" % codename, psec['Architecture'])
138 self.ensureUnique(pkg,
139 "version %s %s" % (codename, psec['Architecture']),
142 # now the stuff where a single variant is sufficient and where we go for
143 # the latest available one
144 if self.has_option(pkg, "newest version") \
145 and apt.VersionCompare(psec['Version'],
146 self.get(pkg, "newest version")) < 0:
149 # everything from here will overwrite existing ones
151 # we seems to have an updated package
152 self.set(pkg, "newest version", psec['Version'])
155 self.set(pkg, "description", psec['Description'])
158 if psec.has_key('Homepage'):
159 self.set(pkg, 'homepage', psec['Homepage'])
162 def genPkgPage(db, pkg):
173 dpa = DebianPkgArchive(
175 'http://elrond/debian/dists/dapper/Release',
176 # 'http://elrond/debian/dists/etch/Release',