/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 nautilus-bzr.py

  • Committer: Jelmer Vernooij
  • Date: 2008-06-29 19:18:34 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: jelmer@samba.org-20080629191834-ha2ecpv5szt96nge
Make sure signed testament matches repository data.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
#
3
3
# Copyright (C) 2006 Jeff Bailey
4
4
# Copyright (C) 2006 Wouter van Heyst
5
 
# Copyright (C) 2006 Jelmer Vernooij
 
5
# Copyright (C) 2006-2008 Jelmer Vernooij <jelmer@samba.org>
6
6
#
7
7
# Published under the GNU GPL
8
8
 
 
9
import gtk
9
10
import nautilus
10
11
import bzrlib
 
12
from bzrlib.branch import Branch
11
13
from bzrlib.bzrdir import BzrDir
12
 
from bzrlib.errors import NotBranchError
 
14
from bzrlib.errors import NotBranchError, NoWorkingTree, UnsupportedProtocol
 
15
from bzrlib.tree import file_status
13
16
from bzrlib.workingtree import WorkingTree
14
 
from bzrlib.tree import file_status
 
17
from bzrlib.config import GlobalConfig
15
18
 
16
19
from bzrlib.plugin import load_plugins
17
20
load_plugins()
18
21
 
19
 
from bzrlib.plugins.gtk import cmd_visualise, cmd_gannotate
 
22
from bzrlib.plugins.gtk import _i18n, cmd_visualise, cmd_gannotate
20
23
 
21
24
class BzrExtension(nautilus.MenuProvider, nautilus.ColumnProvider, nautilus.InfoProvider):
22
25
    def __init__(self):
78
81
        except NotBranchError:
79
82
            return
80
83
 
81
 
        from bzrlib.plugins.gtk.viz.diff import DiffWindow
 
84
        from bzrlib.plugins.gtk.diff import DiffWindow
82
85
        window = DiffWindow()
83
86
        window.set_diff(tree.branch.nick, tree, tree.branch.basis_tree())
84
87
        window.show()
96
99
        try:
97
100
            tree, path = WorkingTree.open_containing(file)
98
101
        except NotBranchError:
99
 
            BzrDir.create_branch_and_repo(file)
 
102
            BzrDir.create_standalone_workingtree(file)
100
103
 
101
104
    def remove_cb(self, menu, vfs_file):
102
105
        # We can only cope with local files
129
132
        from bzrlib.plugins.gtk.branch import BranchDialog
130
133
        
131
134
        dialog = BranchDialog(vfs_file.get_name())
132
 
        dialog.display()
 
135
        response = dialog.run()
 
136
        if response != gtk.RESPONSE_NONE:
 
137
            dialog.hide()
 
138
            dialog.destroy()
133
139
 
134
140
    def commit_cb(self, menu, vfs_file=None):
135
141
        # We can only cope with local files
137
143
            return
138
144
 
139
145
        file = vfs_file.get_uri()
 
146
        tree = None
 
147
        branch = None
140
148
        try:
141
149
            tree, path = WorkingTree.open_containing(file)
142
 
        except NotBranchError:
143
 
            return
 
150
            branch = tree.branch
 
151
        except NotBranchError, e:
 
152
            path = e.path
 
153
            #return
 
154
        except NoWorkingTree, e:
 
155
            path = e.base
 
156
            try:
 
157
                (branch, path) = Branch.open_containing(path)
 
158
            except NotBranchError, e:
 
159
                path = e.path
144
160
 
145
161
        from bzrlib.plugins.gtk.commit import CommitDialog
146
162
        dialog = CommitDialog(tree, path)
147
 
        dialog.display()
148
 
        gtk.main()
 
163
        response = dialog.run()
 
164
        if response != gtk.RESPONSE_NONE:
 
165
            dialog.hide()
 
166
            dialog.destroy()
149
167
 
150
168
    def log_cb(self, menu, vfs_file):
151
169
        # We can only cope with local files
204
222
    def get_background_items(self, window, vfs_file):
205
223
        items = []
206
224
        file = vfs_file.get_uri()
 
225
 
207
226
        try:
208
227
            tree, path = WorkingTree.open_containing(file)
 
228
            disabled_flag = self.check_branch_enabled(tree.branch)
 
229
        except UnsupportedProtocol:
 
230
            return
209
231
        except NotBranchError:
 
232
            disabled_flag = self.check_branch_enabled()
210
233
            item = nautilus.MenuItem('BzrNautilus::newtree',
211
234
                                 'Make directory versioned',
212
235
                                 'Create new Bazaar tree in this folder')
220
243
            items.append(item)
221
244
 
222
245
            return items
 
246
        except NoWorkingTree:
 
247
            return
 
248
        
 
249
        if disabled_flag == 'False':
 
250
            item = nautilus.MenuItem('BzrNautilus::enable',
 
251
                                     'Enable Bazaar Plugin for this Branch',
 
252
                                     'Enable Bazaar plugin for nautilus')
 
253
            item.connect('activate', self.toggle_integration, 'True', vfs_file)
 
254
            return item,
 
255
        else:
 
256
            item = nautilus.MenuItem('BzrNautilus::disable',
 
257
                                      'Disable Bazaar Plugin for the Branch',
 
258
                                      'Disable Bazaar plugin for nautilus')
 
259
            item.connect('activate', self.toggle_integration, 'False', vfs_file)
 
260
            items.append(item)
223
261
 
224
262
        item = nautilus.MenuItem('BzrNautilus::log',
225
263
                             'Log',
247
285
 
248
286
        return items
249
287
 
250
 
 
251
288
    def get_file_items(self, window, files):
252
289
        items = []
253
 
 
 
290
        
 
291
        wtfiles = {}
254
292
        for vfs_file in files:
255
293
            # We can only cope with local files
256
294
            if vfs_file.get_uri_scheme() != 'file':
257
 
                return
 
295
                continue
258
296
 
259
297
            file = vfs_file.get_uri()
260
298
            try:
261
299
                tree, path = WorkingTree.open_containing(file)
 
300
                disabled_flag = self.check_branch_enabled(tree.branch)
262
301
            except NotBranchError:
 
302
                disabled_flag = self.check_branch_enabled()
263
303
                if not vfs_file.is_directory():
 
304
                    continue
 
305
 
 
306
                if disabled_flag == 'False':
264
307
                    return
 
308
 
265
309
                item = nautilus.MenuItem('BzrNautilus::newtree',
266
310
                                     'Make directory versioned',
267
311
                                     'Create new Bazaar tree in %s' % vfs_file.get_name())
268
312
                item.connect('activate', self.newtree_cb, vfs_file)
269
313
                return item,
270
 
 
271
 
            file_class = tree.file_class(path)
272
 
 
273
 
            if file_class == '?':
 
314
            except NoWorkingTree:
 
315
                continue
 
316
            # Refresh the list of filestatuses in the working tree
 
317
            if path not in wtfiles.keys():
 
318
                tree.lock_read()
 
319
                for rpath, file_class, kind, id, entry in tree.list_files():
 
320
                    wtfiles[rpath] = file_class
 
321
                tree.unlock()
 
322
                wtfiles[u''] = 'V'
 
323
 
 
324
            if wtfiles[path] == '?':
274
325
                item = nautilus.MenuItem('BzrNautilus::add',
275
326
                                     'Add',
276
327
                                     'Add as versioned file')
282
333
                                     'Ignore file for versioning')
283
334
                item.connect('activate', self.ignore_cb, vfs_file)
284
335
                items.append(item)
285
 
            elif file_class == 'I':
 
336
            elif wtfiles[path] == 'I':
286
337
                item = nautilus.MenuItem('BzrNautilus::unignore',
287
338
                                     'Unignore',
288
339
                                     'Unignore file for versioning')
289
340
                item.connect('activate', self.unignore_cb, vfs_file)
290
341
                items.append(item)
291
 
            elif file_class == 'V':
 
342
            elif wtfiles[path] == 'V':
292
343
                item = nautilus.MenuItem('BzrNautilus::log',
293
344
                                 'Log',
294
345
                                 'List changes')
328
379
                               "Version control status"),
329
380
 
330
381
    def update_file_info(self, file):
 
382
 
331
383
        if file.get_uri_scheme() != 'file':
332
384
            return
333
385
        
335
387
            tree, path = WorkingTree.open_containing(file.get_uri())
336
388
        except NotBranchError:
337
389
            return
 
390
        except NoWorkingTree:
 
391
            return   
 
392
 
 
393
        disabled_flag = self.check_branch_enabled(tree.branch)
 
394
        if disabled_flag == 'False':
 
395
            return
338
396
 
339
397
        emblem = None
340
398
        status = None
341
399
 
342
400
        if tree.has_filename(path):
343
 
            emblem = 'cvs-controlled'
 
401
            emblem = 'bzr-controlled'
344
402
            status = 'unchanged'
345
403
            id = tree.path2id(path)
346
404
 
347
405
            delta = tree.changes_from(tree.branch.basis_tree())
348
406
            if delta.touches_file_id(id):
349
 
                emblem = 'cvs-modified'
 
407
                emblem = 'bzr-modified'
350
408
                status = 'modified'
351
409
            for f, _, _ in delta.added:
352
410
                if f == path:
353
 
                    emblem = 'cvs-added'
 
411
                    emblem = 'bzr-added'
354
412
                    status = 'added'
355
413
 
356
414
            for of, f, _, _, _, _ in delta.renamed:
358
416
                    status = 'renamed from %s' % f
359
417
 
360
418
        elif tree.branch.basis_tree().has_filename(path):
361
 
            emblem = 'cvs-removed'
 
419
            emblem = 'bzr-removed'
362
420
            status = 'removed'
363
421
        else:
364
422
            # FIXME: Check for ignored files
367
425
        if emblem is not None:
368
426
            file.add_emblem(emblem)
369
427
        file.add_string_attribute('bzr_status', status)
 
428
 
 
429
    def check_branch_enabled(self, branch=None):
 
430
        # Supports global disable, but there is currently no UI to do this
 
431
        config = GlobalConfig()
 
432
        disabled_flag = config.get_user_option('nautilus_integration')
 
433
        if disabled_flag != 'False':
 
434
            if branch is not None:
 
435
                config = branch.get_config()
 
436
                disabled_flag = config.get_user_option('nautilus_integration')
 
437
        return disabled_flag
 
438
 
 
439
    def toggle_integration(self, menu, action, vfs_file=None):
 
440
        try:
 
441
            tree, path = WorkingTree.open_containing(vfs_file.get_uri())
 
442
        except NotBranchError:
 
443
            return
 
444
        except NoWorkingTree:
 
445
            return
 
446
        branch = tree.branch
 
447
        if branch is None:
 
448
            config = GlobalConfig()
 
449
        else:
 
450
            config = branch.get_config()
 
451
        config.set_user_option('nautilus_integration', action)
 
452