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