2 #emacs: -*- mode: python-mode; py-indent-offset: 4; tab-width: 4; indent-tabs-mode: nil -*-
3 #ex: set sts=4 ts=4 sw=4 noet:
5 __author__ = 'Yaroslav Halchenko'
7 __copyright__ = 'Copyright (c) 2010 Yaroslav Halchenko'
12 from copy import deepcopy
13 from debian_bundle import deb822
14 from debian.changelog import Changelog
16 topdir = '/home/yoh/deb/gits/pkg-exppsy/brian'
18 blends_file = os.path.join(topdir, 'debian/blends')
21 def parse_debian_blends(f='debian/blends'):
22 """Parses debian/blends file
24 Returns unprocessed list of customized Deb822 entries
26 # Linearize all the paragraphs since we are not using them
28 for p in deb822.Deb822.iter_paragraphs(open(f)):
31 # Traverse and collect things
33 format_clean = False # do not propagate fields into a new pkg if True
42 format_clean = format_.endswith('-clean')
44 format_ = format_[:-6]
47 newtasks = True # either we need to provide tune-ups
49 elif k == 'depends': # new package
50 if format_clean or pkg is None:
56 pkg.tasks = dict( (t, deb822.OrderedSet()) for t in tasks )
63 if not t in pkg.tasks:
64 pkg.tasks[t] = deb822.Deb822Dict()
67 # just store the key in the pkg itself
72 class DebianMaterials(object):
73 _WNPP_RE = re.compile('^ *\* *Initial release.*closes:? #(?P<bug>[0-9]*).*', re.I)
75 def __init__(self, topdir):
77 self._debiandir = os.path.join(topdir, 'debian')
83 if self._source is None:
84 self._assign_packages()
89 if self._binaries is None:
90 self._assign_packages()
93 def fpath(self, name):
94 return os.path.join(self._debiandir, name)
96 def _assign_packages(self):
98 control = deb822.Deb822.iter_paragraphs(
99 open(self.fpath('control')))
102 "Cannot parse %s file necessary for the %s package entry. Error: %s"
103 % (control_file, pkg['Depends'], str(e)))
107 if v.get('Source', None):
110 self._binaries[v['Package']] = v
112 def get_license(self, package=None, first_only=True):
113 """Return a license(s). Parsed out from debian/copyright if it is
114 in machine readable format
117 # may be package should carry custom copyright file
118 copyright_file_ = self.fpath('%s.copyright' % package)
119 if package and os.path.exists(copyright_file_):
120 copyright_file = copyright_file_
122 copyright_file = self.fpath('copyright')
125 for p in deb822.Deb822.iter_paragraphs(open(copyright_file)):
126 if not 'Files' in p or p['Files'].strip().startswith('debian/'):
129 # Take only the short version of first line
130 l = re.sub('\n.*', '', l).strip()
133 if not l in licenses:
140 return ', '.join(licenses)
143 """Search for a template changelog entry closing "Initial bug
145 for l in open(self.fpath('changelog')):
146 rr = self._WNPP_RE.match(l)
148 return rr.groupdict()['bug']
151 def get_responsible(self):
152 """Returns responsible, atm -- maintainer
154 return self.source['Maintainer']
156 pkgs = parse_debian_blends(f)
157 #pkgs2 = format_packages()
159 # Expand packages which format is complete
161 if pkg.format == 'complete':
162 # expanding, for that we need debian/control
164 debianm = DebianMaterials(topdir)
165 for k, m in (('License', lambda: debianm.get_license(pkg['Depends'])),
166 ('WNPP', debianm.get_wnpp),
168 lambda: debianm.binaries[pkg['Depends']]['Description']),
169 ('Responsible', debianm.get_responsible),
170 ('Homepage', lambda: debianm.source.get('Homepage', None))):