/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
import sys
18
19
try:
20
    import pygtk
21
    pygtk.require("2.0")
22
except:
23
    pass
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
24
25
import gtk
26
import gtk.glade
27
import gobject
28
import pango
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
29
0.11.1 by Jelmer Vernooij
Eliminate olive.backend.errors.
30
import bzrlib.errors as errors
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
31
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
32
from olive import gladefile
33
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
34
def info(location):
35
    """ Get info about branch, working tree, and repository
36
    
37
    :param location: the location of the branch/working tree/repository
38
    
39
    :return: the information in dictionary format
40
    
41
    The following informations are delivered (if available):
42
    ret['location']['lightcoroot']: Light checkout root
43
    ret['location']['sharedrepo']: Shared repository
44
    ret['location']['repobranch']: Repository branch
45
    ret['location']['cobranch']: Checkout of branch
46
    ret['location']['repoco']: Repository checkout
47
    ret['location']['coroot']: Checkout root
48
    ret['location']['branchroot']: Branch root
49
    ret['related']['parentbranch']: Parent branch
50
    ret['related']['publishbranch']: Publish to branch
51
    ret['format']['control']: Control format
52
    ret['format']['workingtree']: Working tree format
53
    ret['format']['branch']: Branch format
54
    ret['format']['repository']: Repository format
55
    ret['locking']['workingtree']: Working tree lock status
56
    ret['locking']['branch']: Branch lock status
57
    ret['locking']['repository']: Repository lock status
58
    ret['missing']['branch']: Missing revisions in branch
59
    ret['missing']['workingtree']: Missing revisions in working tree
60
    ret['wtstats']['unchanged']: Unchanged files
61
    ret['wtstats']['modified']: Modified files
62
    ret['wtstats']['added']: Added files
63
    ret['wtstats']['removed']: Removed files
64
    ret['wtstats']['renamed']: Renamed files
65
    ret['wtstats']['unknown']: Unknown files
66
    ret['wtstats']['ignored']: Ingnored files
67
    ret['wtstats']['subdirs']: Versioned subdirectories
68
    ret['brstats']['revno']: Revisions in branch
69
    ret['brstats']['commiters']: Number of commiters
70
    ret['brstats']['age']: Age of branch in days
71
    ret['brstats']['firstrev']: Time of first revision
72
    ret['brstats']['lastrev']: Time of last revision
73
    ret['repstats']['revisions']: Revisions in repository
74
    ret['repstats']['size']: Size of repository in bytes
75
    """
76
    import bzrlib.bzrdir as bzrdir
77
    
78
    import info_helper
79
    
80
    ret = {}
81
    try:
82
        a_bzrdir = bzrdir.BzrDir.open_containing(location)[0]
83
    except errors.NotBranchError:
84
        raise NotBranchError(location)
85
86
    try:
87
        working = a_bzrdir.open_workingtree()
88
        working.lock_read()
89
        try:
90
            branch = working.branch
91
            repository = branch.repository
92
            control = working.bzrdir
93
            
94
            ret['location'] = info_helper.get_location_info(repository, branch, working)
95
            ret['related'] = info_helper.get_related_info(branch)
96
            ret['format'] = info_helper.get_format_info(control, repository, branch, working)
97
            ret['locking'] = info_helper.get_locking_info(repository, branch, working)
98
            ret['missing'] = {}
99
            ret['missing']['branch'] = info_helper.get_missing_revisions_branch(branch)
100
            ret['missing']['workingtree'] = info_helper.get_missing_revisions_working(working)
101
            ret['wtstats'] = info_helper.get_working_stats(working)
102
            ret['brstats'] = info_helper.get_branch_stats(branch)
103
            ret['repstats'] = info_helper.get_repository_stats(repository)
104
        finally:
105
            working.unlock()
106
            return ret
107
        return
108
    except (errors.NoWorkingTree, errors.NotLocalUrl):
109
        pass
110
111
    try:
112
        branch = a_bzrdir.open_branch()
113
        branch.lock_read()
114
        try:
115
            ret['location'] = info_helper.get_location_info(repository, branch)
116
            ret['related'] = info_helper.get_related_info(branch)
117
            ret['format'] = info_helper.get_format_info(control, repository, branch)
118
            ret['locking'] = info_helper.get_locking_info(repository, branch)
119
            ret['missing']['branch'] = info_helper.get_missing_revisions_branch(branch)
120
            ret['brstats'] = info_helper.get_branch_stats(branch)
121
            ret['repstats'] = info_helper.get_repository_stats(repository)
122
        finally:
123
            branch.unlock()
124
            return ret
125
        return
126
    except errors.NotBranchError:
127
        pass
128
129
    try:
130
        repository = a_bzrdir.open_repository()
131
        repository.lock_read()
132
        try:
133
            ret['location'] = info_helper.get_location_info(repository)
134
            ret['format'] = info_helper.get_format_info(control, repository)
135
            ret['locking'] = info_helper.get_locking_info(repository)
136
            ret['repstats'] = info_helper.get_repository_stats(repository)
137
        finally:
138
            repository.unlock()
139
            return ret
140
        return
141
    except errors.NoRepositoryPresent:
142
        pass
143
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
144
145
class OliveInfo:
146
    """ Display Informations window and perform the needed actions. """
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
147
    def __init__(self, comm):
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
148
        """ Initialize the Informations window. """
0.13.10 by Jelmer Vernooij
Don't pass around gladefile all the time.
149
        self.glade = gtk.glade.XML(gladefile, 'window_info', 'olive-gtk')
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
150
        
0.8.46 by Szilveszter Farkas (Phanatic)
Modified OliveDialog class interface; huge cleanups.
151
        # Communication object
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
152
        self.comm = comm
153
        
154
        # Get the Informations window widget
155
        self.window = self.glade.get_widget('window_info')
156
        
157
        # Check if current location is a branch
158
        self.notbranch = False
159
        try:
0.11.9 by Jelmer Vernooij
Remove last few bits from backend and integrate them where necessary.
160
            self.ret = info(self.comm.get_path())
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
161
        except errors.NotBranchError:
162
            self.notbranch = True
163
            return
164
        
165
        # Dictionary for signal_autoconnect
166
        dic = { "on_button_info_close_clicked": self.close,
167
                "on_expander_info_location_activate": self.activate,
168
                "on_expander_info_related_activate": self.activate,
169
                "on_expander_info_format_activate": self.activate,
170
                "on_expander_info_locking_activate": self.activate,
171
                "on_expander_info_missing_activate": self.activate,
172
                "on_expander_info_wtstats_activate": self.activate,
173
                "on_expander_info_brstats_activate": self.activate,
174
                "on_expander_info_repstats_activate": self.activate }
175
        
176
        # Connect the signals to the handlers
177
        self.glade.signal_autoconnect(dic)
178
        
179
        # Generate status output
180
        self._generate_info()
181
182
    def _generate_info(self):
183
        """ Generate 'bzr info' output. """
184
        # location
185
        if self.ret.has_key('location'):
186
            display = False
187
            e = self.glade.get_widget('expander_info_location')
188
            if self.ret['location'].has_key('lightcoroot'):
189
                ll = self.glade.get_widget('label_info_location_lightcoroot_label')
190
                l = self.glade.get_widget('label_info_location_lightcoroot')
191
                l.set_text(self.ret['location']['lightcoroot'])
192
                ll.show()
193
                l.show()
194
                if not display:
195
                    e.set_expanded(True)
196
                    e.show()
197
                    display = True
198
            if self.ret['location'].has_key('sharedrepo'):
199
                ll = self.glade.get_widget('label_info_location_sharedrepo_label')
200
                l = self.glade.get_widget('label_info_location_sharedrepo')
201
                l.set_text(self.ret['location']['sharedrepo'])
202
                ll.show()
203
                l.show()
204
                if not display:
205
                    e.set_expanded(True)
206
                    e.show()
207
                    display = True
208
            if self.ret['location'].has_key('repobranch'):
209
                ll = self.glade.get_widget('label_info_location_repobranch_label')
210
                l = self.glade.get_widget('label_info_location_repobranch')
211
                l.set_text(self.ret['location']['repobranch'])
212
                ll.show()
213
                l.show()
214
                if not display:
215
                    e.set_expanded(True)
216
                    e.show()
217
                    display = True
218
            if self.ret['location'].has_key('cobranch'):
219
                ll = self.glade.get_widget('label_info_location_cobranch_label')
220
                l = self.glade.get_widget('label_info_location_cobranch')
221
                l.set_text(self.ret['location']['cobranch'])
222
                ll.show()
223
                l.show()
224
                if not display:
225
                    e.set_expanded(True)
226
                    e.show()
227
                    display = True
228
            if self.ret['location'].has_key('repoco'):
229
                ll = self.glade.get_widget('label_info_location_repoco_label')
230
                l = self.glade.get_widget('label_info_location_repoco')
231
                l.set_text(self.ret['location']['repoco'])
232
                ll.show()
233
                l.show()
234
                if not display:
235
                    e.set_expanded(True)
236
                    e.show()
237
                    display = True
238
            if self.ret['location'].has_key('coroot'):
239
                ll = self.glade.get_widget('label_info_location_coroot_label')
240
                l = self.glade.get_widget('label_info_location_coroot')
241
                l.set_text(self.ret['location']['coroot'])
242
                ll.show()
243
                l.show()
244
                if not display:
245
                    e.set_expanded(True)
246
                    e.show()
247
                    display = True
248
            if self.ret['location'].has_key('branchroot'):
249
                ll = self.glade.get_widget('label_info_location_branchroot_label')
250
                l = self.glade.get_widget('label_info_location_branchroot')
251
                l.set_text(self.ret['location']['branchroot'])
252
                ll.show()
253
                l.show()
254
                if not display:
255
                    e.set_expanded(True)
256
                    e.show()
257
                    display = True
258
        # related
259
        if self.ret.has_key('related'):
260
            display = False
261
            e = self.glade.get_widget('expander_info_related')
262
            if self.ret['related'].has_key('parentbranch'):
263
                ll = self.glade.get_widget('label_info_related_parentbranch_label')
264
                l = self.glade.get_widget('label_info_related_parentbranch')
265
                l.set_text(self.ret['related']['parentbranch'])
266
                ll.show()
267
                l.show()
268
                if not display:
269
                    e.set_expanded(True)
270
                    e.show()
271
                    display = True
272
            if self.ret['related'].has_key('publishbranch'):
273
                ll = self.glade.get_widget('label_info_related_publishbranch_label')
274
                l = self.glade.get_widget('label_info_related_publishbranch')
275
                l.set_text(self.ret['related']['publishbranch'])
276
                ll.show()
277
                l.show()
278
                if not display:
279
                    e.set_expanded(True)
280
                    e.show()
281
                    display = True
282
        # format
283
        if self.ret.has_key('format'):
284
            display = False
285
            e = self.glade.get_widget('expander_info_format')
286
            if self.ret['format'].has_key('control'):
287
                ll = self.glade.get_widget('label_info_format_control_label')
288
                l = self.glade.get_widget('label_info_format_control')
289
                l.set_text(self.ret['format']['control'])
290
                ll.show()
291
                l.show()
292
                if not display:
293
                    e.set_expanded(True)
294
                    e.show()
295
                    display = True
296
            if self.ret['format'].has_key('workingtree'):
297
                ll = self.glade.get_widget('label_info_format_workingtree_label')
298
                l = self.glade.get_widget('label_info_format_workingtree')
299
                l.set_text(self.ret['format']['workingtree'])
300
                ll.show()
301
                l.show()
302
                if not display:
303
                    e.set_expanded(True)
304
                    e.show()
305
                    display = True
306
            if self.ret['format'].has_key('branch'):
307
                ll = self.glade.get_widget('label_info_format_branch_label')
308
                l = self.glade.get_widget('label_info_format_branch')
309
                l.set_text(self.ret['format']['branch'])
310
                ll.show()
311
                l.show()
312
                if not display:
313
                    e.set_expanded(True)
314
                    e.show()
315
                    display = True
316
            if self.ret['format'].has_key('repository'):
317
                ll = self.glade.get_widget('label_info_format_repository_label')
318
                l = self.glade.get_widget('label_info_format_repository')
319
                l.set_text(self.ret['format']['repository'])
320
                ll.show()
321
                l.show()
322
                if not display:
323
                    e.set_expanded(True)
324
                    e.show()
325
                    display = True
326
        # locking
327
        if self.ret.has_key('locking'):
328
            display = False
329
            e = self.glade.get_widget('expander_info_locking')
330
            if self.ret['locking'].has_key('workingtree'):
331
                ll = self.glade.get_widget('label_info_locking_workingtree_label')
332
                l = self.glade.get_widget('label_info_locking_workingtree')
333
                l.set_text(self.ret['locking']['workingtree'])
334
                ll.show()
335
                l.show()
336
                if not display:
337
                    e.set_expanded(True)
338
                    e.show()
339
                    display = True
340
            if self.ret['locking'].has_key('branch'):
341
                ll = self.glade.get_widget('label_info_locking_branch_label')
342
                l = self.glade.get_widget('label_info_locking_branch')
343
                l.set_text(self.ret['locking']['branch'])
344
                ll.show()
345
                l.show()
346
                if not display:
347
                    e.set_expanded(True)
348
                    e.show()
349
                    display = True
350
            if self.ret['locking'].has_key('repository'):
351
                ll = self.glade.get_widget('label_info_locking_repository_label')
352
                l = self.glade.get_widget('label_info_locking_repository')
353
                l.set_text(self.ret['locking']['repository'])
354
                ll.show()
355
                l.show()
356
                if not display:
357
                    e.set_expanded(True)
358
                    e.show()
359
                    display = True
360
        # missing - temporary disabled
361
        """
362
        if self.ret.has_key('missing'):
363
            display = False
364
            e = self.glade.get_widget('expander_info_missing')
365
            if self.ret['missing'].has_key('branch'):
366
                ll = self.glade.get_widget('label_info_missing_branch_label')
367
                l = self.glade.get_widget('label_info_missing_branch')
368
                l.set_text(self.ret['missing']['branch'])
369
                ll.set_markup('<b>' + ll.get_text() + '</b>')
370
                ll.show()
371
                l.show()
372
                if not display:
373
                    e.set_expanded(True)
374
                    e.show()
375
                    display = True
376
            if self.ret['missing'].has_key('workingtree'):
377
                ll = self.glade.get_widget('label_info_missing_workingtree_label')
378
                l = self.glade.get_widget('label_info_missing_workingtree')
379
                l.set_text(self.ret['missing']['branch'])
380
                ll.set_markup('<b>' + ll.get_text() + '</b>')
381
                ll.show()
382
                l.show()
383
                if not display:
384
                    e.set_expanded(True)
385
                    e.show()
386
                    display = True
387
        """
388
        # working tree stats
389
        if self.ret.has_key('wtstats'):
390
            display = False
391
            e = self.glade.get_widget('expander_info_wtstats')
392
            if self.ret['wtstats'].has_key('unchanged'):
393
                ll = self.glade.get_widget('label_info_wtstats_unchanged_label')
394
                l = self.glade.get_widget('label_info_wtstats_unchanged')
395
                l.set_text(str(self.ret['wtstats']['unchanged']))
396
                ll.show()
397
                l.show()
398
                if not display:
399
                    e.set_expanded(True)
400
                    e.show()
401
                    display = True
402
            if self.ret['wtstats'].has_key('modified'):
403
                ll = self.glade.get_widget('label_info_wtstats_modified_label')
404
                l = self.glade.get_widget('label_info_wtstats_modified')
405
                l.set_text(str(self.ret['wtstats']['modified']))
406
                ll.show()
407
                l.show()
408
                if not display:
409
                    e.set_expanded(True)
410
                    e.show()
411
                    display = True
412
            if self.ret['wtstats'].has_key('added'):
413
                ll = self.glade.get_widget('label_info_wtstats_added_label')
414
                l = self.glade.get_widget('label_info_wtstats_added')
415
                l.set_text(str(self.ret['wtstats']['added']))
416
                ll.show()
417
                l.show()
418
                if not display:
419
                    e.set_expanded(True)
420
                    e.show()
421
                    display = True
422
            if self.ret['wtstats'].has_key('removed'):
423
                ll = self.glade.get_widget('label_info_wtstats_removed_label')
424
                l = self.glade.get_widget('label_info_wtstats_removed')
425
                l.set_text(str(self.ret['wtstats']['removed']))
426
                ll.show()
427
                l.show()
428
                if not display:
429
                    e.set_expanded(True)
430
                    e.show()
431
                    display = True
432
            if self.ret['wtstats'].has_key('renamed'):
433
                ll = self.glade.get_widget('label_info_wtstats_renamed_label')
434
                l = self.glade.get_widget('label_info_wtstats_renamed')
435
                l.set_text(str(self.ret['wtstats']['renamed']))
436
                ll.show()
437
                l.show()
438
                if not display:
439
                    e.set_expanded(True)
440
                    e.show()
441
                    display = True
442
            if self.ret['wtstats'].has_key('unknown'):
443
                ll = self.glade.get_widget('label_info_wtstats_unknown_label')
444
                l = self.glade.get_widget('label_info_wtstats_unknown')
445
                l.set_text(str(self.ret['wtstats']['unknown']))
446
                ll.show()
447
                l.show()
448
                if not display:
449
                    e.set_expanded(True)
450
                    e.show()
451
                    display = True
452
            if self.ret['wtstats'].has_key('ignored'):
453
                ll = self.glade.get_widget('label_info_wtstats_ignored_label')
454
                l = self.glade.get_widget('label_info_wtstats_ignored')
455
                l.set_text(str(self.ret['wtstats']['ignored']))
456
                ll.show()
457
                l.show()
458
                if not display:
459
                    e.set_expanded(True)
460
                    e.show()
461
                    display = True
462
            if self.ret['wtstats'].has_key('subdirs'):
463
                ll = self.glade.get_widget('label_info_wtstats_subdirs_label')
464
                l = self.glade.get_widget('label_info_wtstats_subdirs')
465
                l.set_text(str(self.ret['wtstats']['subdirs']))
466
                ll.show()
467
                l.show()
468
                if not display:
469
                    e.set_expanded(True)
470
                    e.show()
471
                    display = True
472
        # branch stats
473
        if self.ret.has_key('brstats'):
474
            display = False
475
            e = self.glade.get_widget('expander_info_brstats')
476
            if self.ret['brstats'].has_key('revno'):
477
                ll = self.glade.get_widget('label_info_brstats_revno_label')
478
                l = self.glade.get_widget('label_info_brstats_revno')
479
                l.set_text(str(self.ret['brstats']['revno']))
480
                ll.show()
481
                l.show()
482
                if not display:
483
                    e.set_expanded(True)
484
                    e.show()
485
                    display = True
486
            if self.ret['brstats'].has_key('commiters'):
487
                ll = self.glade.get_widget('label_info_brstats_commiters_label')
488
                l = self.glade.get_widget('label_info_brstats_commiters')
489
                l.set_text(str(self.ret['brstats']['commiters']))
490
                ll.show()
491
                l.show()
492
                if not display:
493
                    e.set_expanded(True)
494
                    e.show()
495
                    display = True
496
            if self.ret['brstats'].has_key('age'):
497
                ll = self.glade.get_widget('label_info_brstats_age_label')
498
                l = self.glade.get_widget('label_info_brstats_age')
499
                l.set_text('%d days' % self.ret['brstats']['age'])
500
                ll.show()
501
                l.show()
502
                if not display:
503
                    e.set_expanded(True)
504
                    e.show()
505
                    display = True
506
            if self.ret['brstats'].has_key('firstrev'):
507
                ll = self.glade.get_widget('label_info_brstats_firstrev_label')
508
                l = self.glade.get_widget('label_info_brstats_firstrev')
509
                l.set_text(self.ret['brstats']['firstrev'])
510
                ll.show()
511
                l.show()
512
                if not display:
513
                    e.set_expanded(True)
514
                    e.show()
515
                    display = True
516
            if self.ret['brstats'].has_key('lastrev'):
517
                ll = self.glade.get_widget('label_info_brstats_lastrev_label')
518
                l = self.glade.get_widget('label_info_brstats_lastrev')
519
                l.set_text(self.ret['brstats']['lastrev'])
520
                ll.show()
521
                l.show()
522
                if not display:
523
                    e.set_expanded(True)
524
                    e.show()
525
                    display = True
526
        # repository stats
527
        if self.ret.has_key('repstats'):
528
            display = False
529
            e = self.glade.get_widget('expander_info_repstats')
530
            if self.ret['repstats'].has_key('revisions'):
531
                ll = self.glade.get_widget('label_info_repstats_revisions_label')
532
                l = self.glade.get_widget('label_info_repstats_revisions')
533
                l.set_text(str(self.ret['repstats']['revisions']))
534
                ll.show()
535
                l.show()
536
                if not display:
537
                    e.set_expanded(True)
538
                    e.show()
539
                    display = True
540
            if self.ret['repstats'].has_key('size'):
541
                ll = self.glade.get_widget('label_info_repstats_size_label')
542
                l = self.glade.get_widget('label_info_repstats_size')
543
                l.set_text('%d KiB' % (self.ret['repstats']['size'] / 1024))
544
                ll.show()
545
                l.show()
546
                if not display:
547
                    e.set_expanded(True)
548
                    e.show()
549
                    display = True
550
    
551
    def activate(self, expander):
552
        """ Redraw the window. """
553
        self.window.resize(50, 50)
554
        self.window.queue_resize()
555
    
556
    def display(self):
557
        """ Display the Informations window. """
558
        if self.notbranch:
0.13.6 by Jelmer Vernooij
Don't pass along dialog context everywhere.
559
            error_dialog(_('Directory is not a branch'),
0.8.55 by Szilveszter Farkas (Phanatic)
Gettext support added.
560
                                     _('You can perform this action only in a branch.'))
0.8.42 by Szilveszter Farkas (Phanatic)
Implemented Informations functionality; some bzrlib API changes handled.
561
            self.close()
562
        else:
563
            self.window.show()
564
565
    def close(self, widget=None):
566
        self.window.destroy()