/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:
784 by Jelmer Vernooij
Only show annotate option for files in nautilus-bzr.
248
            kind = tree.kind(file_id)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
249
            item = Nautilus.MenuItem(name='BzrNautilus::log',
250
                             label='History ...',
251
                             tip='List changes',
252
                             icon='')
253
            item.connect('activate', self.log_cb, tree.bzrdir, path)
254
            yield item
255
256
            if not intertree.file_content_matches(file_id, file_id):
257
                item = Nautilus.MenuItem(name='BzrNautilus::diff',
258
                                 label='View Changes ...',
259
                                 tip='Show differences',
260
                                 icon='')
261
                item.connect('activate', self.diff_cb, tree, path)
262
                yield item
263
264
                item = Nautilus.MenuItem(name='BzrNautilus::commit',
265
                             label='Commit ...',
266
                             tip='Commit Changes',
267
                             icon='')
268
                item.connect('activate', self.commit_cb, tree, path)
269
                yield item
270
271
            item = Nautilus.MenuItem(name='BzrNautilus::remove',
272
                                 label='Remove',
273
                                 tip='Remove this file from versioning',
274
                                 icon='')
275
            item.connect('activate', self.remove_cb, tree, path)
276
            yield item
277
784 by Jelmer Vernooij
Only show annotate option for files in nautilus-bzr.
278
            if kind == 'file':
279
                item = Nautilus.MenuItem(name='BzrNautilus::annotate',
280
                             label='Annotate ...',
281
                             tip='Annotate File Data',
282
                             icon='')
283
                item.connect('activate', self.annotate_cb, tree, path, file_id)
284
                yield item
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
285
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
286
    def get_file_items(self, window, files):
287
        items = []
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
288
        trees = {}
289
290
        try:
291
            for vfs_file in files:
292
                controldir, path = self._open_bzrdir(vfs_file)
293
294
                try:
295
                    tree = trees[controldir.user_url]
296
                except KeyError:
297
                    try:
298
                        tree = controldir.open_workingtree()
299
                    except NoWorkingTree:
300
                        continue
301
                    trees[controldir.user_url] = tree
302
                    tree.lock_read()
303
304
                nautilus_integration = self.check_branch_enabled(tree.branch)
305
                if not nautilus_integration:
306
                    continue
0.5.2 by jbailey at ubuntu
Bring this to a state where it actually works. Specifically:
307
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
308
                intertree = InterTree.get(tree.basis_tree(), tree)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
309
                items.extend(list(self._get_file_menuitems(tree, intertree, path)))
310
        finally:
311
            for tree in trees.itervalues():
312
                tree.unlock()
313
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
314
        return items
88 by Jelmer Vernooij
Show column with file status.
315
316
    def get_columns(self):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
317
        return [
318
            Nautilus.Column(name="BzrNautilus::bzr_status",
319
                            attribute="bzr_status",
320
                            label="Status",
321
                            description="Version control status"),
322
            Nautilus.Column(name="BzrNautilus::bzr_revision",
323
                            attribute="bzr_revision",
324
                            label="Revision",
325
                            description="Last change revision"),
326
            ]
88 by Jelmer Vernooij
Show column with file status.
327
753 by Jelmer Vernooij
Fix columns.
328
    def _file_summary(self, tree, basis_tree, intertree, path):
329
        file_revision = ""
88 by Jelmer Vernooij
Show column with file status.
330
        emblem = None
331
753 by Jelmer Vernooij
Fix columns.
332
        file_id = tree.path2id(path)
333
        if file_id is None:
658.1.1 by Lucas Shrewsbury
Fix #294632 by adding ignored emblem and correct status.
334
            if tree.is_ignored(path):
335
                status = 'ignored'
336
                emblem = 'bzr-ignored'
337
            else:
338
                status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
339
            file_revision = "N/A"
340
        elif tree.has_filename(path): # Still present
341
            if not intertree.file_content_matches(file_id, file_id):
342
                if not basis_tree.has_id(file_id):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
343
                    emblem = 'bzr-added'
88 by Jelmer Vernooij
Show column with file status.
344
                    status = 'added'
753 by Jelmer Vernooij
Fix columns.
345
                    file_revision = "new file"
346
                elif basis_tree.path2id(file_id) != path:
347
                    status = 'bzr-renamed'
348
                    status = 'renamed from %s' % basis_tree.path2id(file_id)
349
                else:
350
                    emblem = 'bzr-modified'
351
                    status = 'modified'
352
            else:
353
                emblem = 'bzr-controlled'
354
                status = 'unchanged'
355
        elif basis_tree.has_filename(path):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
356
            emblem = 'bzr-removed'
88 by Jelmer Vernooij
Show column with file status.
357
            status = 'removed'
358
        else:
359
            # FIXME: Check for ignored files
360
            status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
361
        return (status, emblem, file_revision)
362
363
    def update_file_info(self, vfs_file):
364
        try:
365
            controldir, path = self._open_bzrdir(vfs_file)
366
        except NotBranchError:
367
            return
368
369
        try:
370
            tree = controldir.open_workingtree()
371
        except NoWorkingTree:
372
            return
373
374
        tree.lock_read()
375
        try:
376
            nautilus_integration = self.check_branch_enabled(tree.branch)
377
            if not nautilus_integration:
378
                return
379
380
            basis_tree = tree.basis_tree()
381
            intertree = InterTree.get(basis_tree, tree)
382
383
            basis_tree.lock_read()
384
            try:
385
                (status, emblem, file_revision) = self._file_summary(tree, basis_tree, intertree, path)
386
            finally:
387
                basis_tree.unlock()
388
            if emblem is not None:
389
                vfs_file.add_emblem(emblem)
390
            vfs_file.add_string_attribute('bzr_status', status)
391
            vfs_file.add_string_attribute('bzr_revision', file_revision)
392
        finally:
393
            tree.unlock()
454 by Martin Albisetti
Add the logic to enable/disable the plugin
394
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
395
    def check_branch_enabled(self, branch):
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
396
        # Supports global disable, but there is currently no UI to do this
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
397
        config = branch.get_config_stack()
398
        return config.get("nautilus_integration")
399
755 by Jelmer Vernooij
Add basic property page.
400
    def toggle_integration(self, menu, action, branch):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
401
        config = branch.get_config_stack()
402
        config.set("nautilus_integration", action)
755 by Jelmer Vernooij
Add basic property page.
403
404
    def get_property_pages(self, files):
405
        pages = []
406
        for vfs_file in files:
407
            try:
408
                controldir, path = self._open_bzrdir(vfs_file)
409
            except NotBranchError:
410
                continue
411
412
            try:
413
                tree = controldir.open_workingtree()
414
            except NoWorkingTree:
415
                continue
416
417
            tree.lock_read()
418
            try:
419
                file_id = tree.path2id(path)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
420
                pages.append(PropertyPageFile(tree, file_id, path))
421
                pages.append(PropertyPageBranch(tree.branch))
755 by Jelmer Vernooij
Add basic property page.
422
            finally:
423
                tree.unlock()
424
        return pages
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
425
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
426
    def get_widget(self, uri, window):
427
        controldir, path = ControlDir.open_containing(uri)
428
        try:
429
            tree = controldir.open_workingtree()
430
        except NoWorkingTree:
431
            return
432
        ret = Gtk.HBox(False, 4)
433
        text = 'This is a Bazaar working tree. '
434
        get_shelf_manager = getattr(tree, 'get_shelf_manager', None)
435
        if get_shelf_manager is not None:
436
            manager = get_shelf_manager()
437
            shelves = manager.active_shelves()
438
            if len(shelves) == 0:
439
                pass
440
            elif len(shelves) == 1:
441
                text += '1 shelf exists. '
442
            else:
443
                text += '%d shelf exists. ' % len(shelves)
444
        label = Gtk.Label(text)
445
        label.show()
446
        ret.pack_start(label, True, True, 0)
447
        ret.show_all()
448
        return ret
449
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
450
451
class PropertyPageFile(Nautilus.PropertyPage):
452
453
    def __init__(self, tree, file_id, path):
454
        self.tree = tree
455
        self.file_id = file_id
456
        self.path = path
457
        label = Gtk.Label('File Version')
458
        label.show()
459
460
        table = self._create_table()
461
462
        super(PropertyPageFile, self).__init__(label=label,
463
            name="BzrNautilus::file_page", page=table)
464
465
    def _create_table(self):
466
        table = Gtk.Table(homogeneous=False, columns=2, rows=3)
467
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
468
        table.attach(Gtk.Label(_i18n('File id:')), 0, 1, 0, 1)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
469
        table.attach(Gtk.Label(self.file_id), 1, 2, 0, 1)
470
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
471
        table.attach(Gtk.Label(_i18n('SHA1Sum:')), 0, 1, 1, 2)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
472
        table.attach(Gtk.Label(self.tree.get_file_sha1(self.file_id, self.path)), 1, 1, 1, 2)
473
474
        basis_tree = self.tree.revision_tree(self.tree.last_revision())
475
        last_revision = basis_tree.get_file_revision(self.file_id)
476
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
477
        table.attach(Gtk.Label(_i18n('Last Change Revision:')), 0, 1, 2, 3)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
478
        revno = ".".join([str(x) for x in
479
            self.tree.branch.revision_id_to_dotted_revno(last_revision)])
480
        table.attach(Gtk.Label(revno), 1, 1, 2, 3)
481
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
482
        table.attach(Gtk.Label(_i18n('Last Change Author:')), 0, 1, 3, 4)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
483
        rev = self.tree.branch.repository.get_revision(last_revision)
484
        table.attach(Gtk.Label("\n".join(rev.get_apparent_authors())), 1, 1, 3, 4)
485
486
        table.show_all()
487
        return table
488
489
490
class PropertyPageBranch(Nautilus.PropertyPage):
491
492
    def __init__(self, branch):
493
        self.branch = branch
494
        label = Gtk.Label('Branch')
495
        label.show()
496
497
        table = self._create_table()
498
499
        super(PropertyPageBranch, self).__init__(label=label,
500
            name="BzrNautilus::branch_page", page=table)
501
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
502
    def _create_location_entry(self, get_location, set_location):
503
        location = get_location()
504
        ret = Gtk.Entry()
505
        if location is not None:
506
            ret.set_text(location)
507
        return ret
508
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
509
    def _create_table(self):
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
510
        table = Gtk.Table(homogeneous=False, columns=2, rows=6)
511
512
        self._push_location_entry = self._create_location_entry(
513
            self.branch.get_push_location, self.branch.set_push_location)
514
        self._parent_location_entry = self._create_location_entry(
515
            self.branch.get_parent, self.branch.set_parent)
516
        self._bound_location_entry = self._create_location_entry(
517
            self.branch.get_bound_location, self.branch.set_bound_location)
518
        self._public_location_entry = self._create_location_entry(
519
            self.branch.get_public_branch, self.branch.set_public_branch)
520
        self._submit_location_entry = self._create_location_entry(
521
            self.branch.get_submit_branch, self.branch.set_submit_branch)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
522
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
523
        table.attach(Gtk.Label(_i18n('Push location:')), 0, 1, 0, 1)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
524
        table.attach(self._push_location_entry, 1, 2, 0, 1)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
525
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
526
        table.attach(Gtk.Label(_i18n('Parent location:')), 0, 1, 1, 2)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
527
        table.attach(self._parent_location_entry, 1, 1, 1, 2)
528
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
529
        table.attach(Gtk.Label(_i18n('Bound location:')), 0, 1, 2, 3)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
530
        table.attach(self._bound_location_entry, 1, 1, 2, 3)
531
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
532
        table.attach(Gtk.Label(_i18n('Public location:')), 0, 1, 3, 4)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
533
        table.attach(self._public_location_entry, 1, 1, 3, 4)
534
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
535
        table.attach(Gtk.Label(_i18n('Submit location:')), 0, 1, 4, 5)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
536
        table.attach(self._submit_location_entry, 1, 1, 4, 5)
537
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
538
        self._append_revisions_only = Gtk.CheckButton(_i18n('Append revisions only'))
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
539
        value = self.branch.get_append_revisions_only()
540
        if value is None:
541
            value = False
542
        self._append_revisions_only.set_active(value)
543
        table.attach(self._append_revisions_only, 0, 2, 5, 6)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
544
545
        table.show_all()
546
        return table