/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to diff.py

  • Committer: Jelmer Vernooij
  • Date: 2011-12-11 17:14:12 UTC
  • Revision ID: jelmer@samba.org-20111211171412-cgcn0yas3zlcahzg
StartĀ onĀ 0.104.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
"""
6
6
 
7
7
__copyright__ = "Copyright 2005 Canonical Ltd."
8
 
__author__ = "Scott James Remnant <scott@ubuntu.com>"
 
8
__author__    = "Scott James Remnant <scott@ubuntu.com>"
9
9
 
10
10
 
11
11
from cStringIO import StringIO
12
12
 
 
13
from gi.repository import Gtk
 
14
from gi.repository import Pango
13
15
import os
14
16
import re
15
17
import sys
16
18
import inspect
17
19
try:
18
 
    from xml.etree.ElementTree import (
19
 
        Element,
20
 
        SubElement,
21
 
        tostring,
22
 
        )
23
 
    Element, SubElement, tostring  # Hush PEP8 redefinition.
 
20
    from xml.etree.ElementTree import Element, SubElement, tostring
24
21
except ImportError:
25
 
    from elementtree.ElementTree import (
26
 
        Element,
27
 
        SubElement,
28
 
        tostring,
29
 
        )
 
22
    from elementtree.ElementTree import Element, SubElement, tostring
30
23
 
31
 
from gi.repository import Gtk
32
 
from gi.repository import Pango
33
24
try:
34
25
    from gi.repository import GtkSource
35
26
    have_gtksourceview = True
47
38
    osutils,
48
39
    urlutils,
49
40
    workingtree,
50
 
    )
 
41
)
51
42
from bzrlib.diff import show_diff_trees
52
43
from bzrlib.patches import parse_patches
53
44
from bzrlib.trace import warning
121
112
        if style_scheme_name is not None:
122
113
            style_scheme_mgr = GtkSource.StyleSchemeManager()
123
114
            style_scheme_mgr.append_search_path(GEDIT_USER_STYLES_PATH)
124
 
 
 
115
            
125
116
            style_scheme = style_scheme_mgr.get_scheme(style_scheme_name)
126
 
 
 
117
            
127
118
            if style_scheme is not None:
128
119
                buf.set_style_scheme(style_scheme)
129
120
 
137
128
        """
138
129
        scheme_manager = GtkSource.StyleSchemeManager()
139
130
        style_scheme = scheme_manager.get_scheme('colordiff')
140
 
 
 
131
        
141
132
        # if style scheme not found, we'll generate it from colordiffrc
142
133
        # TODO: reload if colordiffrc has changed.
143
134
        if style_scheme is None:
157
148
            if not colors:
158
149
                # ~/.colordiffrc does not exist
159
150
                return
160
 
 
 
151
            
161
152
            mapping = {
162
153
                # map GtkSourceView2 scheme styles to colordiff names
163
154
                # since GSV is richer, accept new names for extra bits,
168
159
                'diff:file': ['file', 'diffstuff'],
169
160
                'diff:special-case': ['specialcase', 'diffstuff'],
170
161
            }
171
 
 
 
162
            
172
163
            converted_colors = {}
173
164
            for name, values in mapping.items():
174
165
                color = None
179
170
                if color is None:
180
171
                    continue
181
172
                converted_colors[name] = color
182
 
 
 
173
            
183
174
            # some xml magic to produce needed style scheme description
184
175
            e_style_scheme = Element('style-scheme')
185
176
            e_style_scheme.set('id', 'colordiff')
189
180
                style = SubElement(e_style_scheme, 'style')
190
181
                style.set('name', name)
191
182
                style.set('foreground', '#%s' % color)
192
 
 
 
183
            
193
184
            scheme_xml = tostring(e_style_scheme, 'UTF-8')
194
 
            if not os.path.exists(os.path.expanduser(
195
 
                '~/.local/share/gtksourceview-2.0/styles')):
196
 
                os.makedirs(os.path.expanduser(
197
 
                    '~/.local/share/gtksourceview-2.0/styles'))
198
 
            file(os.path.expanduser(
199
 
                '~/.local/share/gtksourceview-2.0/styles/colordiff.xml'),
200
 
                'w').write(scheme_xml)
201
 
 
 
185
            if not os.path.exists(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles')):
 
186
                os.makedirs(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles'))
 
187
            file(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles/colordiff.xml'), 'w').write(scheme_xml)
 
188
            
202
189
            scheme_manager.force_rescan()
203
190
            style_scheme = scheme_manager.get_scheme('colordiff')
204
 
 
 
191
        
205
192
        buf.set_style_scheme(style_scheme)
206
193
 
207
194
    @staticmethod
229
216
#        self.parent_tree.lock_read()
230
217
#        self.rev_tree.lock_read()
231
218
#        try:
232
 
#            self.delta = iter_changes_to_status(
233
 
#               self.parent_tree, self.rev_tree)
 
219
#            self.delta = iter_changes_to_status(self.parent_tree, self.rev_tree)
234
220
#            self.path_to_status = {}
235
221
#            self.path_to_diff = {}
236
222
#            source_inv = self.parent_tree.inventory
237
223
#            target_inv = self.rev_tree.inventory
238
224
#            for (file_id, real_path, change_type, display_path) in self.delta:
239
 
#                self.path_to_status[real_path] = u'=== %s %s' % (
240
 
#                    change_type, display_path)
 
225
#                self.path_to_status[real_path] = u'=== %s %s' % (change_type, display_path)
241
226
#                if change_type in ('modified', 'renamed and modified'):
242
227
#                    source_ie = source_inv[file_id]
243
228
#                    target_ie = target_inv[file_id]
245
230
#                    source_ie.diff(internal_diff, *old path, *old_tree,
246
231
#                                   *new_path, target_ie, self.rev_tree,
247
232
#                                   sio)
248
 
#                    self.path_to_diff[real_path] =
 
233
#                    self.path_to_diff[real_path] = 
249
234
#
250
235
#        finally:
251
236
#            self.rev_tree.unlock()
299
284
    """Diff widget
300
285
 
301
286
    """
302
 
 
303
 
    SHOW_WIDGETS = True
304
 
 
305
287
    def __init__(self):
306
288
        super(DiffWidget, self).__init__()
307
289
 
310
292
        scrollwin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
311
293
        scrollwin.set_shadow_type(Gtk.ShadowType.IN)
312
294
        self.pack1(scrollwin)
313
 
        if self.SHOW_WIDGETS:
314
 
            scrollwin.show()
315
 
 
 
295
        scrollwin.show()
 
296
        
316
297
        self.model = Gtk.TreeStore(str, str)
317
298
        self.treeview = Gtk.TreeView(model=self.model)
318
299
        self.treeview.set_headers_visible(False)
319
300
        self.treeview.set_search_column(1)
320
301
        self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
321
302
        scrollwin.add(self.treeview)
322
 
        if self.SHOW_WIDGETS:
323
 
            self.treeview.show()
 
303
        self.treeview.show()
324
304
 
325
305
        cell = Gtk.CellRendererText()
326
306
        cell.set_property("width-chars", 20)
341
321
        if getattr(self, 'diff_view', None) is None:
342
322
            self.diff_view = DiffFileView()
343
323
            self.pack2(self.diff_view)
344
 
        if self.SHOW_WIDGETS:
345
 
            self.diff_view.show()
 
324
        self.diff_view.show()
346
325
        for oldname, newname, patch in sections:
347
326
            self.diff_view._diffs[newname] = str(patch)
348
327
            if newname is None:
359
338
        if getattr(self, 'diff_view', None) is None:
360
339
            self.diff_view = DiffView()
361
340
            self.pack2(self.diff_view)
362
 
        if self.SHOW_WIDGETS:
363
 
            self.diff_view.show()
 
341
        self.diff_view.show()
364
342
        self.diff_view.set_trees(rev_tree, parent_tree)
365
343
        self.rev_tree = rev_tree
366
344
        self.parent_tree = parent_tree
368
346
        self.model.clear()
369
347
        delta = self.rev_tree.changes_from(self.parent_tree)
370
348
 
371
 
        self.model.append(None, ["Complete Diff", ""])
 
349
        self.model.append(None, [ "Complete Diff", "" ])
372
350
 
373
351
        if len(delta.added):
374
 
            titer = self.model.append(None, ["Added", None])
 
352
            titer = self.model.append(None, [ "Added", None ])
375
353
            for path, id, kind in delta.added:
376
 
                self.model.append(titer, [path, path])
 
354
                self.model.append(titer, [ path, path ])
377
355
 
378
356
        if len(delta.removed):
379
 
            titer = self.model.append(None, ["Removed", None])
 
357
            titer = self.model.append(None, [ "Removed", None ])
380
358
            for path, id, kind in delta.removed:
381
 
                self.model.append(titer, [path, path])
 
359
                self.model.append(titer, [ path, path ])
382
360
 
383
361
        if len(delta.renamed):
384
 
            titer = self.model.append(None, ["Renamed", None])
 
362
            titer = self.model.append(None, [ "Renamed", None ])
385
363
            for oldpath, newpath, id, kind, text_modified, meta_modified \
386
364
                    in delta.renamed:
387
 
                self.model.append(titer, [oldpath, newpath])
 
365
                self.model.append(titer, [ oldpath, newpath ])
388
366
 
389
367
        if len(delta.modified):
390
 
            titer = self.model.append(None, ["Modified", None])
 
368
            titer = self.model.append(None, [ "Modified", None ])
391
369
            for path, id, kind, text_modified, meta_modified in delta.modified:
392
 
                self.model.append(titer, [path, path])
 
370
                self.model.append(titer, [ path, path ])
393
371
 
394
372
        self.treeview.expand_all()
395
373
        self.diff_view.show_diff(None)
410
388
    def _treeview_cursor_cb(self, *args):
411
389
        """Callback for when the treeview cursor changes."""
412
390
        (path, col) = self.treeview.get_cursor()
413
 
        if path is None:
414
 
            return
415
 
        specific_files = [self.model[path][1]]
416
 
        if specific_files == [None]:
417
 
            return
418
 
        elif specific_files == [""]:
 
391
        specific_files = [ self.model[path][1] ]
 
392
        if specific_files == [ None ]:
 
393
            return
 
394
        elif specific_files == [ "" ]:
419
395
            specific_files = None
420
 
 
 
396
        
421
397
        self.diff_view.show_diff(specific_files)
422
 
 
 
398
    
423
399
    def _on_wraplines_toggled(self, widget=None, wrap=False):
424
400
        """Callback for when the wrap lines checkbutton is toggled"""
425
401
        if wrap or widget.get_active():
427
403
        else:
428
404
            self.diff_view.sourceview.set_wrap_mode(Gtk.WrapMode.NONE)
429
405
 
430
 
 
431
406
class DiffWindow(Window):
432
407
    """Diff window.
433
408
 
462
437
        hbox = self._get_button_bar(operations)
463
438
        if hbox is not None:
464
439
            self.vbox.pack_start(hbox, False, True, 0)
465
 
 
 
440
        
 
441
    
466
442
    def _get_menu_bar(self):
467
443
        menubar = Gtk.MenuBar()
468
444
        # View menu
479
455
        menubar.append(mb_view)
480
456
        menubar.show()
481
457
        return menubar
482
 
 
 
458
    
483
459
    def _get_button_bar(self, operations):
484
460
        """Return a button bar to use.
485
461