/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
164 by Jelmer Vernooij
Add copyright information.
1
# Trivial Bazaar plugin for Nautilus
2
#
3
# Copyright (C) 2006 Jeff Bailey
4
# Copyright (C) 2006 Wouter van Heyst
751 by Jelmer Vernooij
Update installation instructions.
5
# Copyright (C) 2006-2011 Jelmer Vernooij <jelmer@samba.org>
6
#
7
# This program is free software; you can redistribute it and/or modify
8
# it under the terms of the GNU General Public License as published by
9
# the Free Software Foundation; either version 3 of the License, or
10
# (at your option) any later version.
11
12
# This program is distributed in the hope that it will be useful,
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
# GNU General Public License for more details.
16
17
# You should have received a copy of the GNU General Public License
18
# along with this program; if not, write to the Free Software
19
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
21
# Installation:
22
# setup.py can install nautilus-bzr to the right system folder, if pkg-config
23
# is present.
24
#
25
# You can also install nautilus-bzr manually by copying it (or linking it from)
26
# ~/.local/share/nautilus-python/extensions/nautilus-bzr.py
164 by Jelmer Vernooij
Add copyright information.
27
753 by Jelmer Vernooij
Fix columns.
28
from gi.repository import Gtk, GObject, Nautilus
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
29
from bzrlib.controldir import ControlDir
724 by Jelmer Vernooij
Fix formatting, imports.
30
from bzrlib.errors import (
31
    NotBranchError,
32
    NoWorkingTree,
33
    )
755 by Jelmer Vernooij
Add basic property page.
34
from bzrlib.ignores import tree_ignores_add_patterns
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
35
from bzrlib.tree import InterTree
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
36
0.7.1 by Wouter van Heyst
use the bzrlib method of loading plugins, takes care of ~/.bazaar/plugins
37
from bzrlib.plugin import load_plugins
38
load_plugins()
39
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
40
from bzrlib.plugins.gtk.i18n import _i18n
41
576.2.1 by Jelmer Vernooij
Use ... notation for options that lead to dialogs, fix some nautilus-bzr menu items that had regressed.
42
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
43
class BazaarExtension(Nautilus.MenuProvider, Nautilus.ColumnProvider,
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
44
        Nautilus.InfoProvider, Nautilus.PropertyPageProvider,
45
        Nautilus.LocationWidgetProvider, GObject.GObject):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
46
    """Nautilus extension providing Bazaar integration."""
724 by Jelmer Vernooij
Fix formatting, imports.
47
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
48
    def __init__(self):
49
        pass
50
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
51
    @classmethod
52
    def _open_bzrdir(cls, vfs_file):
53
        uri = vfs_file.get_uri()
54
        controldir, path = ControlDir.open_containing(uri)
55
        return controldir, path
56
755 by Jelmer Vernooij
Add basic property page.
57
    @classmethod
58
    def _open_tree(cls, vfs_file):
59
        controldir, path = cls._open_bzrdir(vfs_file)
60
        return controldir.open_workingtree(), path
61
62
    def add_cb(self, menu, tree, path):
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
63
        tree.add(path)
64
755 by Jelmer Vernooij
Add basic property page.
65
    def ignore_cb(self, menu, tree, path):
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
66
        # We can only cope with local files
755 by Jelmer Vernooij
Add basic property page.
67
        tree_ignores_add_patterns(tree, [path])
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
68
        #FIXME: Add path to ignore file
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
69
755 by Jelmer Vernooij
Add basic property page.
70
    def unignore_cb(self, menu, tree, path):
71
        pass
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
72
        # We can only cope with local files
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
73
        #FIXME
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
74
755 by Jelmer Vernooij
Add basic property page.
75
    def diff_cb(self, menu, tree, path=None):
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
76
        from bzrlib.plugins.gtk.diff import DiffWindow
0.5.13 by Jelmer Vernooij
Use the gtk plugin rather than separate bzrk and gannotate
77
        window = DiffWindow()
630 by Jelmer Vernooij
Use _get_nick(local=True) rather than .nick to get at a branches' nick, since
78
        window.set_diff(tree.branch._get_nick(local=True), tree, 
79
                        tree.branch.basis_tree())
0.5.13 by Jelmer Vernooij
Use the gtk plugin rather than separate bzrk and gannotate
80
        window.show()
81
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
82
    def newtree_cb(self, menu, vfs_file):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
83
        controldir, path = self._open_bzrdir(vfs_file)
84
        controldir.create_workingtree()
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
85
755 by Jelmer Vernooij
Add basic property page.
86
    def remove_cb(self, menu, tree, path):
0.5.6 by jbailey at ubuntu
Implement remove
87
        tree.remove(path)
88
754 by Jelmer Vernooij
Fix context menus.
89
    def annotate_cb(self, menu, tree, path, file_id):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
90
        from bzrlib.plugins.gtk.annotate.gannotate import GAnnotateWindow
91
        win = GAnnotateWindow()
754 by Jelmer Vernooij
Fix context menus.
92
        win.show()
93
        win.annotate(tree, tree.branch, file_id)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
94
        Gtk.main()
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
95
96
    def clone_cb(self, menu, vfs_file=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
97
        from bzrlib.plugins.gtk.branch import BranchDialog
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
98
        controldir, path = self._open_bzrdir(vfs_file)
99
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
100
        dialog = BranchDialog(vfs_file.get_name())
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
101
        response = dialog.run()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
102
        if response != Gtk.ResponseType.NONE:
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
103
            dialog.hide()
104
            dialog.destroy()
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
105
755 by Jelmer Vernooij
Add basic property page.
106
    def commit_cb(self, menu, tree, path=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
107
        from bzrlib.plugins.gtk.commit import CommitDialog
423.13.4 by Jelmer Vernooij
Fix commit dialog from nautilus.
108
        dialog = CommitDialog(tree, path)
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
109
        response = dialog.run()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
110
        if response != Gtk.ResponseType.NONE:
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
111
            dialog.hide()
112
            dialog.destroy()
0.6.2 by Jelmer Vernooij
Add 'Annotate' menu entry that uses the gannotate bzr plugin
113
755 by Jelmer Vernooij
Add basic property page.
114
    def log_cb(self, menu, controldir, path=None):
753 by Jelmer Vernooij
Fix columns.
115
        from bzrlib.plugins.gtk.viz import BranchWindow
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
116
        branch = controldir.open_branch()
754 by Jelmer Vernooij
Fix context menus.
117
        pp = BranchWindow(branch, [branch.last_revision()], None)
576.2.1 by Jelmer Vernooij
Use ... notation for options that lead to dialogs, fix some nautilus-bzr menu items that had regressed.
118
        pp.show()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
119
        Gtk.main()
0.5.8 by jbailey at ubuntu
Add bzrk plugin
120
755 by Jelmer Vernooij
Add basic property page.
121
    def pull_cb(self, menu, controldir, path=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
122
        from bzrlib.plugins.gtk.pull import PullDialog
755 by Jelmer Vernooij
Add basic property page.
123
        dialog = PullDialog(controldir.open_workingtree(), path)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
124
        dialog.display()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
125
        Gtk.main()
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
126
783 by Jelmer Vernooij
Support opening push dialog from nautilus.
127
    def push_cb(self, menu, controldir, path=None):
128
        from bzrlib.plugins.gtk.push import PushDialog
129
        dialog = PushDialog(branch=controldir.open_workingtree().branch)
130
        dialog.display()
131
        Gtk.main()
132
755 by Jelmer Vernooij
Add basic property page.
133
    def merge_cb(self, menu, tree, path=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
134
        from bzrlib.plugins.gtk.merge import MergeDialog
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
135
        dialog = MergeDialog(tree, path)
576.2.1 by Jelmer Vernooij
Use ... notation for options that lead to dialogs, fix some nautilus-bzr menu items that had regressed.
136
        dialog.run()
578 by Jelmer Vernooij
Merge nautilus improvements.
137
        dialog.destroy()
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
138
755 by Jelmer Vernooij
Add basic property page.
139
    def create_tree_cb(self, menu, controldir):
140
        controldir.create_workingtree()
141
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
142
    def get_background_items(self, window, vfs_file):
143
        try:
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
144
            controldir, path = self._open_bzrdir(vfs_file)
145
        except NotBranchError:
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
146
            return
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
147
        try:
148
            branch = controldir.open_branch()
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
149
        except NotBranchError:
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
150
            items = []
754 by Jelmer Vernooij
Fix context menus.
151
            item = Nautilus.MenuItem(name='BzrNautilus::newtree',
152
                                 label='Make directory versioned',
153
                                 tip='Create new Bazaar tree in this folder',
154
                                 icon='')
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
155
            item.connect('activate', self.newtree_cb, vfs_file)
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
156
            items.append(item)
157
754 by Jelmer Vernooij
Fix context menus.
158
            item = Nautilus.MenuItem(name='BzrNautilus::clone',
159
                                 label='Checkout Bazaar branch ...',
160
                                 tip='Checkout Existing Bazaar Branch',
161
                                 icon='')
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
162
            item.connect('activate', self.clone_cb, vfs_file)
163
            items.append(item)
164
            return items
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
165
166
        items = []
167
168
        nautilus_integration = self.check_branch_enabled(branch)
169
        if not nautilus_integration:
754 by Jelmer Vernooij
Fix context menus.
170
            item = Nautilus.MenuItem(name='BzrNautilus::enable',
171
                                     label='Enable Bazaar Plugin for this Branch',
172
                                     tip='Enable Bazaar plugin for nautilus',
173
                                     icon='')
755 by Jelmer Vernooij
Add basic property page.
174
            item.connect('activate', self.toggle_integration, True, branch)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
175
            return [item]
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
176
        else:
754 by Jelmer Vernooij
Fix context menus.
177
            item = Nautilus.MenuItem(name='BzrNautilus::disable',
178
                                     label='Disable Bazaar Plugin this Branch',
179
                                     tip='Disable Bazaar plugin for nautilus',
180
                                     icon='')
755 by Jelmer Vernooij
Add basic property page.
181
            item.connect('activate', self.toggle_integration, False, branch)
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
182
            items.append(item)
0.5.8 by jbailey at ubuntu
Add bzrk plugin
183
754 by Jelmer Vernooij
Fix context menus.
184
        item = Nautilus.MenuItem(name='BzrNautilus::log',
185
                             label='History ...',
186
                             tip='Show Bazaar history',
187
                             icon='')
755 by Jelmer Vernooij
Add basic property page.
188
        item.connect('activate', self.log_cb, controldir)
81 by Jelmer Vernooij
Remove unnecessary "#!/usr/bin/python" shebang lines (fixes #59125).
189
        items.append(item)
0.5.15 by Jelmer Vernooij
Add 'Commit' entries
190
754 by Jelmer Vernooij
Fix context menus.
191
        item = Nautilus.MenuItem(name='BzrNautilus::pull',
192
                             label='Pull ...',
193
                             tip='Pull from another branch',
194
                             icon='')
755 by Jelmer Vernooij
Add basic property page.
195
        item.connect('activate', self.pull_cb, controldir)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
196
        items.append(item)
197
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
198
        try:
199
            tree = controldir.open_workingtree()
200
        except NoWorkingTree:
754 by Jelmer Vernooij
Fix context menus.
201
            item = Nautilus.MenuItem(name='BzrNautilus::create_tree',
202
                                 label='Create working tree...',
203
                                 tip='Create a working tree for this branch',
204
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
205
            item.connect('activate', self.create_tree_cb, controldir)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
206
            items.append(item)
207
        else:
754 by Jelmer Vernooij
Fix context menus.
208
            item = Nautilus.MenuItem(name='BzrNautilus::merge',
209
                                 label='Merge ...',
210
                                 tip='Merge from another branch',
211
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
212
            item.connect('activate', self.merge_cb, tree, path)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
213
            items.append(item)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
214
754 by Jelmer Vernooij
Fix context menus.
215
            item = Nautilus.MenuItem(name='BzrNautilus::commit',
216
                                 label='Commit ...',
217
                                 tip='Commit Changes',
218
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
219
            item.connect('activate', self.commit_cb, tree, path)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
220
            items.append(item)
0.5.15 by Jelmer Vernooij
Add 'Commit' entries
221
222
        return items
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
223
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
224
    def _get_file_menuitems(self, tree, intertree, path):
225
        file_id = tree.path2id(path)
226
        if file_id is None:
227
            item = Nautilus.MenuItem(name='BzrNautilus::add',
228
                                 label='Add',
229
                                 tip='Add as versioned file',
230
                                 icon='')
231
            item.connect('activate', self.add_cb, tree, path)
232
            yield item
233
234
            item = Nautilus.MenuItem(name='BzrNautilus::ignore',
235
                                 label='Ignore',
236
                                 tip='Ignore file for versioning',
237
                                 icon='')
238
            item.connect('activate', self.ignore_cb, tree, path)
239
            yield item
240
        elif tree.is_ignored(path):
241
            item = Nautilus.MenuItem(name='BzrNautilus::unignore',
242
                                 label='Unignore',
243
                                 tip='Unignore file for versioning',
244
                                 icon='')
245
            item.connect('activate', self.unignore_cb, tree, path)
246
            yield item
247
        else:
248
            item = Nautilus.MenuItem(name='BzrNautilus::log',
249
                             label='History ...',
250
                             tip='List changes',
251
                             icon='')
252
            item.connect('activate', self.log_cb, tree.bzrdir, path)
253
            yield item
254
255
            if not intertree.file_content_matches(file_id, file_id):
256
                item = Nautilus.MenuItem(name='BzrNautilus::diff',
257
                                 label='View Changes ...',
258
                                 tip='Show differences',
259
                                 icon='')
260
                item.connect('activate', self.diff_cb, tree, path)
261
                yield item
262
263
                item = Nautilus.MenuItem(name='BzrNautilus::commit',
264
                             label='Commit ...',
265
                             tip='Commit Changes',
266
                             icon='')
267
                item.connect('activate', self.commit_cb, tree, path)
268
                yield item
269
270
            item = Nautilus.MenuItem(name='BzrNautilus::remove',
271
                                 label='Remove',
272
                                 tip='Remove this file from versioning',
273
                                 icon='')
274
            item.connect('activate', self.remove_cb, tree, path)
275
            yield item
276
277
            item = Nautilus.MenuItem(name='BzrNautilus::annotate',
278
                         label='Annotate ...',
279
                         tip='Annotate File Data',
280
                         icon='')
281
            item.connect('activate', self.annotate_cb, tree, path, file_id)
282
            yield item
283
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
284
    def get_file_items(self, window, files):
285
        items = []
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
286
        trees = {}
287
288
        try:
289
            for vfs_file in files:
290
                controldir, path = self._open_bzrdir(vfs_file)
291
292
                try:
293
                    tree = trees[controldir.user_url]
294
                except KeyError:
295
                    try:
296
                        tree = controldir.open_workingtree()
297
                    except NoWorkingTree:
298
                        continue
299
                    trees[controldir.user_url] = tree
300
                    tree.lock_read()
301
302
                nautilus_integration = self.check_branch_enabled(tree.branch)
303
                if not nautilus_integration:
304
                    continue
0.5.2 by jbailey at ubuntu
Bring this to a state where it actually works. Specifically:
305
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
306
                intertree = InterTree.get(tree.basis_tree(), tree)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
307
                items.extend(list(self._get_file_menuitems(tree, intertree, path)))
308
        finally:
309
            for tree in trees.itervalues():
310
                tree.unlock()
311
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
312
        return items
88 by Jelmer Vernooij
Show column with file status.
313
314
    def get_columns(self):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
315
        return [
316
            Nautilus.Column(name="BzrNautilus::bzr_status",
317
                            attribute="bzr_status",
318
                            label="Status",
319
                            description="Version control status"),
320
            Nautilus.Column(name="BzrNautilus::bzr_revision",
321
                            attribute="bzr_revision",
322
                            label="Revision",
323
                            description="Last change revision"),
324
            ]
88 by Jelmer Vernooij
Show column with file status.
325
753 by Jelmer Vernooij
Fix columns.
326
    def _file_summary(self, tree, basis_tree, intertree, path):
327
        file_revision = ""
88 by Jelmer Vernooij
Show column with file status.
328
        emblem = None
329
753 by Jelmer Vernooij
Fix columns.
330
        file_id = tree.path2id(path)
331
        if file_id is None:
658.1.1 by Lucas Shrewsbury
Fix #294632 by adding ignored emblem and correct status.
332
            if tree.is_ignored(path):
333
                status = 'ignored'
334
                emblem = 'bzr-ignored'
335
            else:
336
                status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
337
            file_revision = "N/A"
338
        elif tree.has_filename(path): # Still present
339
            if not intertree.file_content_matches(file_id, file_id):
340
                if not basis_tree.has_id(file_id):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
341
                    emblem = 'bzr-added'
88 by Jelmer Vernooij
Show column with file status.
342
                    status = 'added'
753 by Jelmer Vernooij
Fix columns.
343
                    file_revision = "new file"
344
                elif basis_tree.path2id(file_id) != path:
345
                    status = 'bzr-renamed'
346
                    status = 'renamed from %s' % basis_tree.path2id(file_id)
347
                else:
348
                    emblem = 'bzr-modified'
349
                    status = 'modified'
350
            else:
351
                emblem = 'bzr-controlled'
352
                status = 'unchanged'
353
        elif basis_tree.has_filename(path):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
354
            emblem = 'bzr-removed'
88 by Jelmer Vernooij
Show column with file status.
355
            status = 'removed'
356
        else:
357
            # FIXME: Check for ignored files
358
            status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
359
        return (status, emblem, file_revision)
360
361
    def update_file_info(self, vfs_file):
362
        try:
363
            controldir, path = self._open_bzrdir(vfs_file)
364
        except NotBranchError:
365
            return
366
367
        try:
368
            tree = controldir.open_workingtree()
369
        except NoWorkingTree:
370
            return
371
372
        tree.lock_read()
373
        try:
374
            nautilus_integration = self.check_branch_enabled(tree.branch)
375
            if not nautilus_integration:
376
                return
377
378
            basis_tree = tree.basis_tree()
379
            intertree = InterTree.get(basis_tree, tree)
380
381
            basis_tree.lock_read()
382
            try:
383
                (status, emblem, file_revision) = self._file_summary(tree, basis_tree, intertree, path)
384
            finally:
385
                basis_tree.unlock()
386
            if emblem is not None:
387
                vfs_file.add_emblem(emblem)
388
            vfs_file.add_string_attribute('bzr_status', status)
389
            vfs_file.add_string_attribute('bzr_revision', file_revision)
390
        finally:
391
            tree.unlock()
454 by Martin Albisetti
Add the logic to enable/disable the plugin
392
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
393
    def check_branch_enabled(self, branch):
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
394
        # Supports global disable, but there is currently no UI to do this
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
395
        config = branch.get_config_stack()
396
        return config.get("nautilus_integration")
397
755 by Jelmer Vernooij
Add basic property page.
398
    def toggle_integration(self, menu, action, branch):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
399
        config = branch.get_config_stack()
400
        config.set("nautilus_integration", action)
755 by Jelmer Vernooij
Add basic property page.
401
402
    def get_property_pages(self, files):
403
        pages = []
404
        for vfs_file in files:
405
            try:
406
                controldir, path = self._open_bzrdir(vfs_file)
407
            except NotBranchError:
408
                continue
409
410
            try:
411
                tree = controldir.open_workingtree()
412
            except NoWorkingTree:
413
                continue
414
415
            tree.lock_read()
416
            try:
417
                file_id = tree.path2id(path)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
418
                pages.append(PropertyPageFile(tree, file_id, path))
419
                pages.append(PropertyPageBranch(tree.branch))
755 by Jelmer Vernooij
Add basic property page.
420
            finally:
421
                tree.unlock()
422
        return pages
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
423
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
424
    def get_widget(self, uri, window):
425
        controldir, path = ControlDir.open_containing(uri)
426
        try:
427
            tree = controldir.open_workingtree()
428
        except NoWorkingTree:
429
            return
430
        ret = Gtk.HBox(False, 4)
431
        text = 'This is a Bazaar working tree. '
432
        get_shelf_manager = getattr(tree, 'get_shelf_manager', None)
433
        if get_shelf_manager is not None:
434
            manager = get_shelf_manager()
435
            shelves = manager.active_shelves()
436
            if len(shelves) == 0:
437
                pass
438
            elif len(shelves) == 1:
439
                text += '1 shelf exists. '
440
            else:
441
                text += '%d shelf exists. ' % len(shelves)
442
        label = Gtk.Label(text)
443
        label.show()
444
        ret.pack_start(label, True, True, 0)
445
        ret.show_all()
446
        return ret
447
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
448
449
class PropertyPageFile(Nautilus.PropertyPage):
450
451
    def __init__(self, tree, file_id, path):
452
        self.tree = tree
453
        self.file_id = file_id
454
        self.path = path
455
        label = Gtk.Label('File Version')
456
        label.show()
457
458
        table = self._create_table()
459
460
        super(PropertyPageFile, self).__init__(label=label,
461
            name="BzrNautilus::file_page", page=table)
462
463
    def _create_table(self):
464
        table = Gtk.Table(homogeneous=False, columns=2, rows=3)
465
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
466
        table.attach(Gtk.Label(_i18n('File id:')), 0, 1, 0, 1)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
467
        table.attach(Gtk.Label(self.file_id), 1, 2, 0, 1)
468
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
469
        table.attach(Gtk.Label(_i18n('SHA1Sum:')), 0, 1, 1, 2)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
470
        table.attach(Gtk.Label(self.tree.get_file_sha1(self.file_id, self.path)), 1, 1, 1, 2)
471
472
        basis_tree = self.tree.revision_tree(self.tree.last_revision())
473
        last_revision = basis_tree.get_file_revision(self.file_id)
474
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
475
        table.attach(Gtk.Label(_i18n('Last Change Revision:')), 0, 1, 2, 3)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
476
        revno = ".".join([str(x) for x in
477
            self.tree.branch.revision_id_to_dotted_revno(last_revision)])
478
        table.attach(Gtk.Label(revno), 1, 1, 2, 3)
479
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
480
        table.attach(Gtk.Label(_i18n('Last Change Author:')), 0, 1, 3, 4)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
481
        rev = self.tree.branch.repository.get_revision(last_revision)
482
        table.attach(Gtk.Label("\n".join(rev.get_apparent_authors())), 1, 1, 3, 4)
483
484
        table.show_all()
485
        return table
486
487
488
class PropertyPageBranch(Nautilus.PropertyPage):
489
490
    def __init__(self, branch):
491
        self.branch = branch
492
        label = Gtk.Label('Branch')
493
        label.show()
494
495
        table = self._create_table()
496
497
        super(PropertyPageBranch, self).__init__(label=label,
498
            name="BzrNautilus::branch_page", page=table)
499
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
500
    def _create_location_entry(self, get_location, set_location):
501
        location = get_location()
502
        ret = Gtk.Entry()
503
        if location is not None:
504
            ret.set_text(location)
505
        return ret
506
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
507
    def _create_table(self):
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
508
        table = Gtk.Table(homogeneous=False, columns=2, rows=6)
509
510
        self._push_location_entry = self._create_location_entry(
511
            self.branch.get_push_location, self.branch.set_push_location)
512
        self._parent_location_entry = self._create_location_entry(
513
            self.branch.get_parent, self.branch.set_parent)
514
        self._bound_location_entry = self._create_location_entry(
515
            self.branch.get_bound_location, self.branch.set_bound_location)
516
        self._public_location_entry = self._create_location_entry(
517
            self.branch.get_public_branch, self.branch.set_public_branch)
518
        self._submit_location_entry = self._create_location_entry(
519
            self.branch.get_submit_branch, self.branch.set_submit_branch)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
520
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
521
        table.attach(Gtk.Label(_i18n('Push location:')), 0, 1, 0, 1)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
522
        table.attach(self._push_location_entry, 1, 2, 0, 1)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
523
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
524
        table.attach(Gtk.Label(_i18n('Parent location:')), 0, 1, 1, 2)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
525
        table.attach(self._parent_location_entry, 1, 1, 1, 2)
526
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
527
        table.attach(Gtk.Label(_i18n('Bound location:')), 0, 1, 2, 3)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
528
        table.attach(self._bound_location_entry, 1, 1, 2, 3)
529
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
530
        table.attach(Gtk.Label(_i18n('Public location:')), 0, 1, 3, 4)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
531
        table.attach(self._public_location_entry, 1, 1, 3, 4)
532
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
533
        table.attach(Gtk.Label(_i18n('Submit location:')), 0, 1, 4, 5)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
534
        table.attach(self._submit_location_entry, 1, 1, 4, 5)
535
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
536
        self._append_revisions_only = Gtk.CheckButton(_i18n('Append revisions only'))
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
537
        value = self.branch.get_append_revisions_only()
538
        if value is None:
539
            value = False
540
        self._append_revisions_only.set_active(value)
541
        table.attach(self._append_revisions_only, 0, 2, 5, 6)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
542
543
        table.show_all()
544
        return table