File: overrides.py

package info (click to toggle)
linda 0.3.24
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 1,852 kB
  • ctags: 765
  • sloc: python: 8,731; makefile: 136
file content (88 lines) | stat: -rw-r--r-- 4,151 bytes parent folder | download
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
import os, re
from linda import root, clparser
from linda.debug import dprint
from linda.funcs import run_external_cmd, ExtCmdException
from linda.parser.debfilename import DebFilenameParser
from linda.parser.override import OverrideParser, OverrideParserException

class Overrides:
    def __init__(self, file, lab):
        self.file = file
        debfn = DebFilenameParser(file)
        self.pkg_name = debfn.package
        self.data = {}
        self.lab = lab
    
    def parse(self):
        for directory in ('%s/overrides' % root, '/etc/linda/overrides', \
            os.path.expanduser('~/.linda/overrides')):
            for file in ('all', self.pkg_name):
                dprint(_('Trying to parse %s/%s for overrides.') % \
                    (directory, file), 2)
                try:
                    override = OverrideParser('%s/%s' % (directory, file))
                except EnvironmentError:
                    continue
                except OverrideParserException, e:
                    dprint(_('Failed to parse %s/s for overrides: %s.') % \
                        (directory, file, e), 2)
                self.merge(override)
        if clparser['more-overrides']:
            dprint(_('Trying to parse %s for overrides.') % \
                clparser['more-overrides'], 2)
            override = OverrideParser(clparser['more-overrides'])
            self.merge(override)
        if os.path.exists(os.path.join(self.lab, 'data.tar.gz')):
            file_name = './usr/share/linda/overrides/%s' % self.pkg_name
            dprint(_('Trying to parse in-deb overrides.'), 2)
            indeb = open(os.path.join(self.lab, 'indeb'), 'w')
            try:
                output = run_external_cmd('tar zxfO %s %s' % \
                    (os.path.join(self.lab, 'data.tar.gz'), file_name))
                indeb.write(output)
                indeb.close()
                override = OverrideParser(os.path.join(self.lab, 'indeb'))
                self.merge(override)
            except ExtCmdException:
                pass
            except OverrideParserException, e:
                dprint(_('Failed to parse in-deb overrides: %s.') % e, 2)
            os.unlink(os.path.join(self.lab, 'indeb'))
        if clparser['print-overrides']:
            print _("Overrides: %s") % self.data

    def merge(self, data):
        for key in data.keys():
            self.data[key] = data[key]

    def check(self, err_dicts, data_files):
        for err_dict in err_dicts.keys():
            for tag in err_dicts[err_dict].keys():
                dprint("Checking overrides for %s." % tag)
                if self.data.has_key(tag):
                    if not self.data[tag]:
                        del err_dicts[err_dict][tag]
                        dprint(_("Overridding tag %s.") % tag)
                    elif self.data[tag].has_key('Type'):
                        dprint("Overridding tag %s's type of %s to %s." % \
                            (tag, data_files[err_dict][tag]['Type'], \
                             self.data[tag]['Type']))
                        data_files[err_dict][tag]['Type'] = \
                            self.data[tag]['Type']
                    elif self.data[tag].has_key('Data'):
                        to_del = []
                        if not err_dicts[err_dict][tag][0]:
                            if not self.data[tag].has_key('Type'):
                                del err_dicts[err_dict][tag]
                                continue
                        for error in range(len(err_dicts[err_dict][tag])):
                            for data in err_dicts[err_dict][tag][error]:
                                if re.search(self.data[tag]['Data'],
                                    str(data)) and error not in to_del:
                                    to_del.insert(0, error)
                        for deleting in to_del:
                            del err_dicts[err_dict][tag][deleting]
                        dprint("Overridding tag %s which has data %s." % \
                            (tag, self.data[tag]['Data']))
        return err_dicts, data_files