1
# Trivial Bazaar plugin for Nautilus
3
# Copyright (C) 2006 Jeff Bailey
4
# Copyright (C) 2006 Wouter van Heyst
5
# Copyright (C) 2006-2008 Jelmer Vernooij <jelmer@samba.org>
7
# Published under the GNU GPL
12
from bzrlib.branch import Branch
13
3
from bzrlib.bzrdir import BzrDir
14
from bzrlib.errors import NotBranchError, NoWorkingTree, UnsupportedProtocol
4
from bzrlib.errors import NotBranchError
5
from bzrlib.workingtree import WorkingTree
15
6
from bzrlib.tree import file_status
16
from bzrlib.workingtree import WorkingTree
17
from bzrlib.config import GlobalConfig
19
8
from bzrlib.plugin import load_plugins
22
from bzrlib.plugins.gtk import _i18n, cmd_gannotate, start_viz_window
24
print "Bazaar nautilus module initialized"
11
from bzrlib.plugins.gtk import cmd_visualise, cmd_gannotate
27
13
class BzrExtension(nautilus.MenuProvider, nautilus.ColumnProvider, nautilus.InfoProvider):
28
14
def __init__(self):
149
131
file = vfs_file.get_uri()
153
133
tree, path = WorkingTree.open_containing(file)
155
except NotBranchError, e:
158
except NoWorkingTree, e:
161
(branch, path) = Branch.open_containing(path)
162
except NotBranchError, e:
134
except NotBranchError:
165
from bzrlib.plugins.gtk.commit import CommitDialog
137
from bzrlib.plugins.gtk.olive.commit import CommitDialog
166
138
dialog = CommitDialog(tree, path)
167
response = dialog.run()
168
if response != gtk.RESPONSE_NONE:
172
142
def log_cb(self, menu, vfs_file):
173
143
# We can only cope with local files
217
188
except NotBranchError:
220
from bzrlib.plugins.gtk.merge import MergeDialog
191
from bzrlib.plugins.gtk.olive.merge import MergeDialog
221
192
dialog = MergeDialog(tree, path)
225
196
def get_background_items(self, window, vfs_file):
227
198
file = vfs_file.get_uri()
230
200
tree, path = WorkingTree.open_containing(file)
231
disabled_flag = self.check_branch_enabled(tree.branch)
232
except UnsupportedProtocol:
234
201
except NotBranchError:
235
disabled_flag = self.check_branch_enabled()
236
202
item = nautilus.MenuItem('BzrNautilus::newtree',
237
203
'Make directory versioned',
238
204
'Create new Bazaar tree in this folder')
240
206
items.append(item)
242
208
item = nautilus.MenuItem('BzrNautilus::clone',
243
'Checkout Bazaar branch ...',
209
'Checkout Bazaar branch',
244
210
'Checkout Existing Bazaar Branch')
245
211
item.connect('activate', self.clone_cb, vfs_file)
246
212
items.append(item)
249
except NoWorkingTree:
252
if disabled_flag == 'False':
253
item = nautilus.MenuItem('BzrNautilus::enable',
254
'Enable Bazaar Plugin for this Branch',
255
'Enable Bazaar plugin for nautilus')
256
item.connect('activate', self.toggle_integration, 'True', vfs_file)
259
item = nautilus.MenuItem('BzrNautilus::disable',
260
'Disable Bazaar Plugin this Branch',
261
'Disable Bazaar plugin for nautilus')
262
item.connect('activate', self.toggle_integration, 'False', vfs_file)
265
216
item = nautilus.MenuItem('BzrNautilus::log',
267
218
'Show Bazaar history')
268
219
item.connect('activate', self.log_cb, vfs_file)
269
220
items.append(item)
271
222
item = nautilus.MenuItem('BzrNautilus::pull',
273
224
'Pull from another branch')
274
225
item.connect('activate', self.pull_cb, vfs_file)
275
226
items.append(item)
277
228
item = nautilus.MenuItem('BzrNautilus::merge',
279
230
'Merge from another branch')
280
231
item.connect('activate', self.merge_cb, vfs_file)
281
232
items.append(item)
283
234
item = nautilus.MenuItem('BzrNautilus::commit',
285
236
'Commit Changes')
286
237
item.connect('activate', self.commit_cb, vfs_file)
287
238
items.append(item)
291
243
def get_file_items(self, window, files):
295
246
for vfs_file in files:
296
247
# We can only cope with local files
297
248
if vfs_file.get_uri_scheme() != 'file':
300
251
file = vfs_file.get_uri()
302
253
tree, path = WorkingTree.open_containing(file)
303
disabled_flag = self.check_branch_enabled(tree.branch)
304
254
except NotBranchError:
305
disabled_flag = self.check_branch_enabled()
306
255
if not vfs_file.is_directory():
309
if disabled_flag == 'False':
312
257
item = nautilus.MenuItem('BzrNautilus::newtree',
313
258
'Make directory versioned',
314
259
'Create new Bazaar tree in %s' % vfs_file.get_name())
315
260
item.connect('activate', self.newtree_cb, vfs_file)
317
except NoWorkingTree:
319
# Refresh the list of filestatuses in the working tree
320
if path not in wtfiles.keys():
322
for rpath, file_class, kind, id, entry in tree.list_files():
323
wtfiles[rpath] = file_class
327
if wtfiles[path] == '?':
263
file_class = tree.file_class(path)
265
if file_class == '?':
328
266
item = nautilus.MenuItem('BzrNautilus::add',
330
268
'Add as versioned file')
336
274
'Ignore file for versioning')
337
275
item.connect('activate', self.ignore_cb, vfs_file)
338
276
items.append(item)
339
elif wtfiles[path] == 'I':
277
elif file_class == 'I':
340
278
item = nautilus.MenuItem('BzrNautilus::unignore',
342
280
'Unignore file for versioning')
343
281
item.connect('activate', self.unignore_cb, vfs_file)
344
282
items.append(item)
345
elif wtfiles[path] == 'V':
283
elif file_class == 'V':
346
284
item = nautilus.MenuItem('BzrNautilus::log',
349
287
item.connect('activate', self.log_cb, vfs_file)
350
288
items.append(item)
352
290
item = nautilus.MenuItem('BzrNautilus::diff',
354
292
'Show differences')
355
293
item.connect('activate', self.diff_cb, vfs_file)
356
294
items.append(item)
390
327
tree, path = WorkingTree.open_containing(file.get_uri())
391
328
except NotBranchError:
393
except NoWorkingTree:
396
disabled_flag = self.check_branch_enabled(tree.branch)
397
if disabled_flag == 'False':
403
334
if tree.has_filename(path):
404
emblem = 'bzr-controlled'
335
emblem = 'cvs-controlled'
405
336
status = 'unchanged'
406
337
id = tree.path2id(path)
408
339
delta = tree.changes_from(tree.branch.basis_tree())
409
340
if delta.touches_file_id(id):
410
emblem = 'bzr-modified'
341
emblem = 'cvs-modified'
411
342
status = 'modified'
412
343
for f, _, _ in delta.added:
417
348
for of, f, _, _, _, _ in delta.renamed:
428
359
if emblem is not None:
429
360
file.add_emblem(emblem)
430
361
file.add_string_attribute('bzr_status', status)
432
def check_branch_enabled(self, branch=None):
433
# Supports global disable, but there is currently no UI to do this
434
config = GlobalConfig()
435
disabled_flag = config.get_user_option('nautilus_integration')
436
if disabled_flag != 'False':
437
if branch is not None:
438
config = branch.get_config()
439
disabled_flag = config.get_user_option('nautilus_integration')
442
def toggle_integration(self, menu, action, vfs_file=None):
444
tree, path = WorkingTree.open_containing(vfs_file.get_uri())
445
except NotBranchError:
447
except NoWorkingTree:
451
config = GlobalConfig()
453
config = branch.get_config()
454
config.set_user_option('nautilus_integration', action)