3
3
# Copyright (C) 2006 Jeff Bailey
4
4
# Copyright (C) 2006 Wouter van Heyst
5
# Copyright (C) 2006-2008 Jelmer Vernooij <jelmer@samba.org>
5
# Copyright (C) 2006 Jelmer Vernooij
7
7
# Published under the GNU GPL
12
from bzrlib.branch import Branch
13
11
from bzrlib.bzrdir import BzrDir
14
from bzrlib.errors import NotBranchError, NoWorkingTree, UnsupportedProtocol
12
from bzrlib.errors import NotBranchError
13
from bzrlib.workingtree import WorkingTree
15
14
from bzrlib.tree import file_status
16
from bzrlib.workingtree import WorkingTree
17
from bzrlib.config import GlobalConfig
19
16
from bzrlib.plugin import load_plugins
22
from bzrlib.plugins.gtk import _i18n
23
from bzrlib.plugins.gtk.commands import cmd_gannotate, start_viz_window
25
print "Bazaar nautilus module initialized"
19
from bzrlib.plugins.gtk import cmd_visualise, cmd_gannotate
28
21
class BzrExtension(nautilus.MenuProvider, nautilus.ColumnProvider, nautilus.InfoProvider):
29
22
def __init__(self):
150
139
file = vfs_file.get_uri()
154
141
tree, path = WorkingTree.open_containing(file)
156
except NotBranchError, e:
159
except NoWorkingTree, e:
162
(branch, path) = Branch.open_containing(path)
163
except NotBranchError, e:
142
except NotBranchError:
166
145
from bzrlib.plugins.gtk.commit import CommitDialog
167
146
dialog = CommitDialog(tree, path)
168
response = dialog.run()
169
if response != gtk.RESPONSE_NONE:
173
150
def log_cb(self, menu, vfs_file):
174
151
# We can only cope with local files
221
199
from bzrlib.plugins.gtk.merge import MergeDialog
222
200
dialog = MergeDialog(tree, path)
226
204
def get_background_items(self, window, vfs_file):
228
206
file = vfs_file.get_uri()
231
208
tree, path = WorkingTree.open_containing(file)
232
disabled_flag = self.check_branch_enabled(tree.branch)
233
except UnsupportedProtocol:
235
209
except NotBranchError:
236
disabled_flag = self.check_branch_enabled()
237
210
item = nautilus.MenuItem('BzrNautilus::newtree',
238
211
'Make directory versioned',
239
212
'Create new Bazaar tree in this folder')
241
214
items.append(item)
243
216
item = nautilus.MenuItem('BzrNautilus::clone',
244
'Checkout Bazaar branch ...',
217
'Checkout Bazaar branch',
245
218
'Checkout Existing Bazaar Branch')
246
219
item.connect('activate', self.clone_cb, vfs_file)
247
220
items.append(item)
250
except NoWorkingTree:
253
if disabled_flag == 'False':
254
item = nautilus.MenuItem('BzrNautilus::enable',
255
'Enable Bazaar Plugin for this Branch',
256
'Enable Bazaar plugin for nautilus')
257
item.connect('activate', self.toggle_integration, 'True', vfs_file)
260
item = nautilus.MenuItem('BzrNautilus::disable',
261
'Disable Bazaar Plugin this Branch',
262
'Disable Bazaar plugin for nautilus')
263
item.connect('activate', self.toggle_integration, 'False', vfs_file)
266
224
item = nautilus.MenuItem('BzrNautilus::log',
268
226
'Show Bazaar history')
269
227
item.connect('activate', self.log_cb, vfs_file)
270
228
items.append(item)
272
230
item = nautilus.MenuItem('BzrNautilus::pull',
274
232
'Pull from another branch')
275
233
item.connect('activate', self.pull_cb, vfs_file)
276
234
items.append(item)
278
236
item = nautilus.MenuItem('BzrNautilus::merge',
280
238
'Merge from another branch')
281
239
item.connect('activate', self.merge_cb, vfs_file)
282
240
items.append(item)
284
242
item = nautilus.MenuItem('BzrNautilus::commit',
286
244
'Commit Changes')
287
245
item.connect('activate', self.commit_cb, vfs_file)
288
246
items.append(item)
292
251
def get_file_items(self, window, files):
296
254
for vfs_file in files:
297
255
# We can only cope with local files
298
256
if vfs_file.get_uri_scheme() != 'file':
301
259
file = vfs_file.get_uri()
303
261
tree, path = WorkingTree.open_containing(file)
304
disabled_flag = self.check_branch_enabled(tree.branch)
305
262
except NotBranchError:
306
disabled_flag = self.check_branch_enabled()
307
263
if not vfs_file.is_directory():
310
if disabled_flag == 'False':
313
265
item = nautilus.MenuItem('BzrNautilus::newtree',
314
266
'Make directory versioned',
315
267
'Create new Bazaar tree in %s' % vfs_file.get_name())
316
268
item.connect('activate', self.newtree_cb, vfs_file)
318
except NoWorkingTree:
320
# Refresh the list of filestatuses in the working tree
321
if path not in wtfiles.keys():
323
for rpath, file_class, kind, id, entry in tree.list_files():
324
wtfiles[rpath] = file_class
328
if wtfiles[path] == '?':
271
file_class = tree.file_class(path)
273
if file_class == '?':
329
274
item = nautilus.MenuItem('BzrNautilus::add',
331
276
'Add as versioned file')
337
282
'Ignore file for versioning')
338
283
item.connect('activate', self.ignore_cb, vfs_file)
339
284
items.append(item)
340
elif wtfiles[path] == 'I':
285
elif file_class == 'I':
341
286
item = nautilus.MenuItem('BzrNautilus::unignore',
343
288
'Unignore file for versioning')
344
289
item.connect('activate', self.unignore_cb, vfs_file)
345
290
items.append(item)
346
elif wtfiles[path] == 'V':
291
elif file_class == 'V':
347
292
item = nautilus.MenuItem('BzrNautilus::log',
350
295
item.connect('activate', self.log_cb, vfs_file)
351
296
items.append(item)
353
298
item = nautilus.MenuItem('BzrNautilus::diff',
355
300
'Show differences')
356
301
item.connect('activate', self.diff_cb, vfs_file)
357
302
items.append(item)
391
335
tree, path = WorkingTree.open_containing(file.get_uri())
392
336
except NotBranchError:
394
except NoWorkingTree:
397
disabled_flag = self.check_branch_enabled(tree.branch)
398
if disabled_flag == 'False':
404
id = tree.path2id(path)
406
if tree.is_ignored(path):
408
emblem = 'bzr-ignored'
410
status = 'unversioned'
412
elif tree.has_filename(path):
413
emblem = 'bzr-controlled'
342
if tree.has_filename(path):
343
emblem = 'cvs-controlled'
414
344
status = 'unchanged'
345
id = tree.path2id(path)
416
347
delta = tree.changes_from(tree.branch.basis_tree())
417
348
if delta.touches_file_id(id):
418
emblem = 'bzr-modified'
349
emblem = 'cvs-modified'
419
350
status = 'modified'
420
351
for f, _, _ in delta.added:
425
356
for of, f, _, _, _, _ in delta.renamed:
436
367
if emblem is not None:
437
368
file.add_emblem(emblem)
438
369
file.add_string_attribute('bzr_status', status)
440
def check_branch_enabled(self, branch=None):
441
# Supports global disable, but there is currently no UI to do this
442
config = GlobalConfig()
443
disabled_flag = config.get_user_option('nautilus_integration')
444
if disabled_flag != 'False':
445
if branch is not None:
446
config = branch.get_config()
447
disabled_flag = config.get_user_option('nautilus_integration')
450
def toggle_integration(self, menu, action, vfs_file=None):
452
tree, path = WorkingTree.open_containing(vfs_file.get_uri())
453
except NotBranchError:
455
except NoWorkingTree:
459
config = GlobalConfig()
461
config = branch.get_config()
462
config.set_user_option('nautilus_integration', action)