Package linda :: Package parser :: Module control
[hide private]

Source Code for Module linda.parser.control

 1  import re 
 2  from linda.debug import dprint 
 3  from linda.parser.rfc822parser import RFC822Parser 
 4   
5 -class DebianControlParser(RFC822Parser):
6 - def parse(self):
7 self.split() 8 for stanza in range(len(self.data)): 9 for key in self.data[stanza].keys(): 10 if key in ('depends', 'pre-depends', 'provides', 'replaces', \ 11 'conflicts', 'build-depends', 'recommends', \ 12 'build-depends-indep', 'suggests'): 13 self.data[stanza]['%s-x' % key] = {} 14 self.data[stanza]['%s-orig' % key] = self.data[stanza][key] 15 for data in self.data[stanza][key].split(','): 16 data = data.replace('\n', '') 17 dprint(_("Stanza %s; Key %s; Data: %s") % (stanza, \ 18 key, data), 5) 19 for alt in data.split('|'): 20 alt = alt.strip() 21 if alt.startswith('('): 22 alt = alt[1:] 23 elif alt.endswith(')') and alt.find('(') == -1: 24 alt = alt[:-1] 25 dprint(_("Calling add_data: key %s, alt %s") % \ 26 (key, alt), 5) 27 tmp_alt = [alt] 28 if data.find('(') == data.find('[') == -1: 29 tmp_alt = alt.split(' ') 30 for x in tmp_alt: 31 if x == '': 32 continue 33 self.add_data(stanza, key, x) 34 self.data[stanza][key] = self.data[stanza]['%s-x' % key] 35 del self.data[stanza]['%s-x' % key] 36 elif key == 'description': 37 tmp_desc = self.data[stanza][key].split('\n') 38 self.data[stanza][key] = [tmp_desc[0], \ 39 '\n'.join(tmp_desc[1:])] 40 elif key == 'section': 41 tmp_section = self.data[stanza][key].split('/') 42 self.data[stanza][key] = tmp_section 43 dprint(_("Control file: %s") % self.data, 3)
44
45 - def add_data(self, stanza, key, data):
46 match_obj = re.match(r'^(?P<pkg>[^ \(]+)(\s*\(\s?(?P<rel_type>[<>=]+)\s?(?P<relation>.+)\))?(\s+\[(?P<arch>.+)\])?.*$', data) 47 if not match_obj: 48 raise DCPException("Data \"%s\" doesn't match" % data) 49 else: 50 line = match_obj.groupdict() 51 if line['arch'] == None: 52 line['arch'] = [None] 53 else: 54 line['arch'] = line['arch'].split(' ') 55 if self.data[stanza]['%s-x' % key].has_key(line['pkg']): 56 self.data[stanza]['%s-x' % key][line['pkg']]['relation'].append([line['rel_type'], line['relation']]) 57 self.data[stanza]['%s-x' % key][line['pkg']]['arch'] = \ 58 self.data[stanza]['%s-x' % key][line['pkg']]['arch'] + \ 59 line['arch'] 60 else: 61 self.data[stanza]['%s-x' % key][line['pkg']] = {'relation': \ 62 [[line['rel_type'], line['relation']]], 'arch': line['arch']}
63
64 - def stanzas(self):
65 return len(self.data)
66
67 -class DCPException(Exception):
68 pass
69