92
95
            self.buffer = gtksourceview.SourceBuffer()
 
93
96
            slm = gtksourceview.SourceLanguagesManager()
 
94
97
            gsl = slm.get_language_from_mime_type("text/x-patch")
 
 
98
            self.apply_colordiffrc(gsl)
 
95
99
            self.buffer.set_language(gsl)
 
96
100
            self.buffer.set_highlight(True)
 
 
168
172
        show_diff_trees(self.parent_tree, self.rev_tree, s, specific_files)
 
169
173
        self.buffer.set_text(s.getvalue().decode(sys.getdefaultencoding(), 'replace'))
 
 
176
    def apply_colordiffrc(lang):
 
 
177
        """Set style colors in lang to that specified in colordiff config file.
 
 
179
        Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read.
 
 
181
        :param lang: a gtksourceview.SourceLanguage object.
 
 
183
        def parse_colordiffrc(fileobj):
 
 
184
            """Parse fileobj as a colordiff configuration file.
 
 
186
            :return: A dict with the key -> value pairs.
 
 
190
                if re.match(r'^\s*#', line):
 
 
192
                key, val = line.split('=')
 
 
193
                colors[key.strip()] = val.strip()
 
 
198
        for f in ('~/.colordiffrc', '~/.colordiffrc.bzr-gtk'):
 
 
199
            f = os.path.expanduser(f)
 
 
200
            if os.path.exists(f):
 
 
204
                    warning('could not open file %s: %s' % (f, str(e)))
 
 
206
                    colors.update(parse_colordiffrc(f))
 
 
210
            # ~/.colordiffrc does not exist
 
 
214
                # map GtkSourceView tags to colordiff names
 
 
215
                # since GSV is richer, accept new names for extra bits,
 
 
216
                # defaulting to old names if they're not present
 
 
217
                'Added@32@line': ['newtext'],
 
 
218
                'Removed@32@line': ['oldtext'],
 
 
219
                'Location': ['location', 'diffstuff'],
 
 
220
                'Diff@32@file': ['file', 'diffstuff'],
 
 
221
                'Special@32@case': ['specialcase', 'diffstuff'],
 
 
224
        for tag in lang.get_tags():
 
 
225
            tag_id = tag.get_id()
 
 
226
            keys = mapping.get(tag_id, [])
 
 
230
                color = colors.get(key, None)
 
 
231
                if color is not None:
 
 
237
            style = gtksourceview.SourceTagStyle()
 
 
239
                style.foreground = gtk.gdk.color_parse(color)
 
 
241
                warning('not a valid color: %s' % color)
 
 
243
                lang.set_tag_style(tag_id, style)