/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
576.2.1 by Jelmer Vernooij
Use ... notation for options that lead to dialogs, fix some nautilus-bzr menu items that had regressed.
40
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
41
class BazaarExtension(Nautilus.MenuProvider, Nautilus.ColumnProvider,
42
        Nautilus.InfoProvider, Nautilus.PropertyPageProvider, GObject.GObject):
43
    """Nautilus extension providing Bazaar integration."""
724 by Jelmer Vernooij
Fix formatting, imports.
44
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
45
    def __init__(self):
46
        pass
47
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
48
    @classmethod
49
    def _open_bzrdir(cls, vfs_file):
50
        uri = vfs_file.get_uri()
51
        controldir, path = ControlDir.open_containing(uri)
52
        return controldir, path
53
755 by Jelmer Vernooij
Add basic property page.
54
    @classmethod
55
    def _open_tree(cls, vfs_file):
56
        controldir, path = cls._open_bzrdir(vfs_file)
57
        return controldir.open_workingtree(), path
58
59
    def add_cb(self, menu, tree, path):
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
60
        tree.add(path)
61
755 by Jelmer Vernooij
Add basic property page.
62
    def ignore_cb(self, menu, tree, path):
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
63
        # We can only cope with local files
755 by Jelmer Vernooij
Add basic property page.
64
        tree_ignores_add_patterns(tree, [path])
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
65
        #FIXME: Add path to ignore file
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
66
755 by Jelmer Vernooij
Add basic property page.
67
    def unignore_cb(self, menu, tree, path):
68
        pass
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
69
        # We can only cope with local files
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
70
        #FIXME
0.5.4 by jbailey at ubuntu
Add 'add' function. Give framework for other callbacks.
71
755 by Jelmer Vernooij
Add basic property page.
72
    def diff_cb(self, menu, tree, path=None):
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
73
        from bzrlib.plugins.gtk.diff import DiffWindow
0.5.13 by Jelmer Vernooij
Use the gtk plugin rather than separate bzrk and gannotate
74
        window = DiffWindow()
630 by Jelmer Vernooij
Use _get_nick(local=True) rather than .nick to get at a branches' nick, since
75
        window.set_diff(tree.branch._get_nick(local=True), tree, 
76
                        tree.branch.basis_tree())
0.5.13 by Jelmer Vernooij
Use the gtk plugin rather than separate bzrk and gannotate
77
        window.show()
78
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
79
    def newtree_cb(self, menu, vfs_file):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
80
        controldir, path = self._open_bzrdir(vfs_file)
81
        controldir.create_workingtree()
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
82
755 by Jelmer Vernooij
Add basic property page.
83
    def remove_cb(self, menu, tree, path):
0.5.6 by jbailey at ubuntu
Implement remove
84
        tree.remove(path)
85
754 by Jelmer Vernooij
Fix context menus.
86
    def annotate_cb(self, menu, tree, path, file_id):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
87
        from bzrlib.plugins.gtk.annotate.gannotate import GAnnotateWindow
88
        win = GAnnotateWindow()
754 by Jelmer Vernooij
Fix context menus.
89
        win.show()
90
        win.annotate(tree, tree.branch, file_id)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
91
        Gtk.main()
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
92
93
    def clone_cb(self, menu, vfs_file=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
94
        from bzrlib.plugins.gtk.branch import BranchDialog
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
95
        controldir, path = self._open_bzrdir(vfs_file)
96
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
97
        dialog = BranchDialog(vfs_file.get_name())
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
98
        response = dialog.run()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
99
        if response != Gtk.ResponseType.NONE:
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
100
            dialog.hide()
101
            dialog.destroy()
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
102
755 by Jelmer Vernooij
Add basic property page.
103
    def commit_cb(self, menu, tree, path=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
104
        from bzrlib.plugins.gtk.commit import CommitDialog
423.13.4 by Jelmer Vernooij
Fix commit dialog from nautilus.
105
        dialog = CommitDialog(tree, path)
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
106
        response = dialog.run()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
107
        if response != Gtk.ResponseType.NONE:
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
108
            dialog.hide()
109
            dialog.destroy()
0.6.2 by Jelmer Vernooij
Add 'Annotate' menu entry that uses the gannotate bzr plugin
110
755 by Jelmer Vernooij
Add basic property page.
111
    def log_cb(self, menu, controldir, path=None):
753 by Jelmer Vernooij
Fix columns.
112
        from bzrlib.plugins.gtk.viz import BranchWindow
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
113
        branch = controldir.open_branch()
754 by Jelmer Vernooij
Fix context menus.
114
        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.
115
        pp.show()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
116
        Gtk.main()
0.5.8 by jbailey at ubuntu
Add bzrk plugin
117
755 by Jelmer Vernooij
Add basic property page.
118
    def pull_cb(self, menu, controldir, path=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
119
        from bzrlib.plugins.gtk.pull import PullDialog
755 by Jelmer Vernooij
Add basic property page.
120
        dialog = PullDialog(controldir.open_workingtree(), path)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
121
        dialog.display()
734.1.1 by Curtis Hovey
Mechanical changes made by pygi.convert.sh.
122
        Gtk.main()
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
123
755 by Jelmer Vernooij
Add basic property page.
124
    def merge_cb(self, menu, tree, path=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
125
        from bzrlib.plugins.gtk.merge import MergeDialog
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
126
        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.
127
        dialog.run()
578 by Jelmer Vernooij
Merge nautilus improvements.
128
        dialog.destroy()
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
129
755 by Jelmer Vernooij
Add basic property page.
130
    def create_tree_cb(self, menu, controldir):
131
        controldir.create_workingtree()
132
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
133
    def get_background_items(self, window, vfs_file):
134
        try:
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
135
            controldir, path = self._open_bzrdir(vfs_file)
136
        except NotBranchError:
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
137
            return
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
138
        try:
139
            branch = controldir.open_branch()
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
140
        except NotBranchError:
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
141
            items = []
754 by Jelmer Vernooij
Fix context menus.
142
            item = Nautilus.MenuItem(name='BzrNautilus::newtree',
143
                                 label='Make directory versioned',
144
                                 tip='Create new Bazaar tree in this folder',
145
                                 icon='')
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
146
            item.connect('activate', self.newtree_cb, vfs_file)
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
147
            items.append(item)
148
754 by Jelmer Vernooij
Fix context menus.
149
            item = Nautilus.MenuItem(name='BzrNautilus::clone',
150
                                 label='Checkout Bazaar branch ...',
151
                                 tip='Checkout Existing Bazaar Branch',
152
                                 icon='')
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
153
            item.connect('activate', self.clone_cb, vfs_file)
154
            items.append(item)
155
            return items
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
156
157
        items = []
158
159
        nautilus_integration = self.check_branch_enabled(branch)
160
        if not nautilus_integration:
754 by Jelmer Vernooij
Fix context menus.
161
            item = Nautilus.MenuItem(name='BzrNautilus::enable',
162
                                     label='Enable Bazaar Plugin for this Branch',
163
                                     tip='Enable Bazaar plugin for nautilus',
164
                                     icon='')
755 by Jelmer Vernooij
Add basic property page.
165
            item.connect('activate', self.toggle_integration, True, branch)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
166
            return [item]
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
167
        else:
754 by Jelmer Vernooij
Fix context menus.
168
            item = Nautilus.MenuItem(name='BzrNautilus::disable',
169
                                     label='Disable Bazaar Plugin this Branch',
170
                                     tip='Disable Bazaar plugin for nautilus',
171
                                     icon='')
755 by Jelmer Vernooij
Add basic property page.
172
            item.connect('activate', self.toggle_integration, False, branch)
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
173
            items.append(item)
0.5.8 by jbailey at ubuntu
Add bzrk plugin
174
754 by Jelmer Vernooij
Fix context menus.
175
        item = Nautilus.MenuItem(name='BzrNautilus::log',
176
                             label='History ...',
177
                             tip='Show Bazaar history',
178
                             icon='')
755 by Jelmer Vernooij
Add basic property page.
179
        item.connect('activate', self.log_cb, controldir)
81 by Jelmer Vernooij
Remove unnecessary "#!/usr/bin/python" shebang lines (fixes #59125).
180
        items.append(item)
0.5.15 by Jelmer Vernooij
Add 'Commit' entries
181
754 by Jelmer Vernooij
Fix context menus.
182
        item = Nautilus.MenuItem(name='BzrNautilus::pull',
183
                             label='Pull ...',
184
                             tip='Pull from another branch',
185
                             icon='')
755 by Jelmer Vernooij
Add basic property page.
186
        item.connect('activate', self.pull_cb, controldir)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
187
        items.append(item)
188
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
189
        try:
190
            tree = controldir.open_workingtree()
191
        except NoWorkingTree:
754 by Jelmer Vernooij
Fix context menus.
192
            item = Nautilus.MenuItem(name='BzrNautilus::create_tree',
193
                                 label='Create working tree...',
194
                                 tip='Create a working tree for this branch',
195
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
196
            item.connect('activate', self.create_tree_cb, controldir)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
197
            items.append(item)
198
        else:
754 by Jelmer Vernooij
Fix context menus.
199
            item = Nautilus.MenuItem(name='BzrNautilus::merge',
200
                                 label='Merge ...',
201
                                 tip='Merge from another branch',
202
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
203
            item.connect('activate', self.merge_cb, tree, path)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
204
            items.append(item)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
205
754 by Jelmer Vernooij
Fix context menus.
206
            item = Nautilus.MenuItem(name='BzrNautilus::commit',
207
                                 label='Commit ...',
208
                                 tip='Commit Changes',
209
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
210
            item.connect('activate', self.commit_cb, tree, path)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
211
            items.append(item)
0.5.15 by Jelmer Vernooij
Add 'Commit' entries
212
213
        return items
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
214
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
215
    def _get_file_menuitems(self, tree, intertree, path):
216
        file_id = tree.path2id(path)
217
        if file_id is None:
218
            item = Nautilus.MenuItem(name='BzrNautilus::add',
219
                                 label='Add',
220
                                 tip='Add as versioned file',
221
                                 icon='')
222
            item.connect('activate', self.add_cb, tree, path)
223
            yield item
224
225
            item = Nautilus.MenuItem(name='BzrNautilus::ignore',
226
                                 label='Ignore',
227
                                 tip='Ignore file for versioning',
228
                                 icon='')
229
            item.connect('activate', self.ignore_cb, tree, path)
230
            yield item
231
        elif tree.is_ignored(path):
232
            item = Nautilus.MenuItem(name='BzrNautilus::unignore',
233
                                 label='Unignore',
234
                                 tip='Unignore file for versioning',
235
                                 icon='')
236
            item.connect('activate', self.unignore_cb, tree, path)
237
            yield item
238
        else:
239
            item = Nautilus.MenuItem(name='BzrNautilus::log',
240
                             label='History ...',
241
                             tip='List changes',
242
                             icon='')
243
            item.connect('activate', self.log_cb, tree.bzrdir, path)
244
            yield item
245
246
            if not intertree.file_content_matches(file_id, file_id):
247
                item = Nautilus.MenuItem(name='BzrNautilus::diff',
248
                                 label='View Changes ...',
249
                                 tip='Show differences',
250
                                 icon='')
251
                item.connect('activate', self.diff_cb, tree, path)
252
                yield item
253
254
                item = Nautilus.MenuItem(name='BzrNautilus::commit',
255
                             label='Commit ...',
256
                             tip='Commit Changes',
257
                             icon='')
258
                item.connect('activate', self.commit_cb, tree, path)
259
                yield item
260
261
            item = Nautilus.MenuItem(name='BzrNautilus::remove',
262
                                 label='Remove',
263
                                 tip='Remove this file from versioning',
264
                                 icon='')
265
            item.connect('activate', self.remove_cb, tree, path)
266
            yield item
267
268
            item = Nautilus.MenuItem(name='BzrNautilus::annotate',
269
                         label='Annotate ...',
270
                         tip='Annotate File Data',
271
                         icon='')
272
            item.connect('activate', self.annotate_cb, tree, path, file_id)
273
            yield item
274
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
275
    def get_file_items(self, window, files):
276
        items = []
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
277
        trees = {}
278
279
        try:
280
            for vfs_file in files:
281
                controldir, path = self._open_bzrdir(vfs_file)
282
283
                try:
284
                    tree = trees[controldir.user_url]
285
                except KeyError:
286
                    try:
287
                        tree = controldir.open_workingtree()
288
                    except NoWorkingTree:
289
                        continue
290
                    trees[controldir.user_url] = tree
291
                    tree.lock_read()
292
293
                nautilus_integration = self.check_branch_enabled(tree.branch)
294
                if not nautilus_integration:
295
                    continue
0.5.2 by jbailey at ubuntu
Bring this to a state where it actually works. Specifically:
296
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
297
                intertree = InterTree.get(tree.basis_tree(), tree)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
298
                items.extend(list(self._get_file_menuitems(tree, intertree, path)))
299
        finally:
300
            for tree in trees.itervalues():
301
                tree.unlock()
302
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
303
        return items
88 by Jelmer Vernooij
Show column with file status.
304
305
    def get_columns(self):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
306
        return [
307
            Nautilus.Column(name="BzrNautilus::bzr_status",
308
                            attribute="bzr_status",
309
                            label="Status",
310
                            description="Version control status"),
311
            Nautilus.Column(name="BzrNautilus::bzr_revision",
312
                            attribute="bzr_revision",
313
                            label="Revision",
314
                            description="Last change revision"),
315
            ]
88 by Jelmer Vernooij
Show column with file status.
316
753 by Jelmer Vernooij
Fix columns.
317
    def _file_summary(self, tree, basis_tree, intertree, path):
318
        file_revision = ""
88 by Jelmer Vernooij
Show column with file status.
319
        emblem = None
320
753 by Jelmer Vernooij
Fix columns.
321
        file_id = tree.path2id(path)
322
        if file_id is None:
658.1.1 by Lucas Shrewsbury
Fix #294632 by adding ignored emblem and correct status.
323
            if tree.is_ignored(path):
324
                status = 'ignored'
325
                emblem = 'bzr-ignored'
326
            else:
327
                status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
328
            file_revision = "N/A"
329
        elif tree.has_filename(path): # Still present
330
            if not intertree.file_content_matches(file_id, file_id):
331
                if not basis_tree.has_id(file_id):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
332
                    emblem = 'bzr-added'
88 by Jelmer Vernooij
Show column with file status.
333
                    status = 'added'
753 by Jelmer Vernooij
Fix columns.
334
                    file_revision = "new file"
335
                elif basis_tree.path2id(file_id) != path:
336
                    status = 'bzr-renamed'
337
                    status = 'renamed from %s' % basis_tree.path2id(file_id)
338
                else:
339
                    emblem = 'bzr-modified'
340
                    status = 'modified'
341
            else:
342
                emblem = 'bzr-controlled'
343
                status = 'unchanged'
344
        elif basis_tree.has_filename(path):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
345
            emblem = 'bzr-removed'
88 by Jelmer Vernooij
Show column with file status.
346
            status = 'removed'
347
        else:
348
            # FIXME: Check for ignored files
349
            status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
350
        return (status, emblem, file_revision)
351
352
    def update_file_info(self, vfs_file):
353
        try:
354
            controldir, path = self._open_bzrdir(vfs_file)
355
        except NotBranchError:
356
            return
357
358
        try:
359
            tree = controldir.open_workingtree()
360
        except NoWorkingTree:
361
            return
362
363
        tree.lock_read()
364
        try:
365
            nautilus_integration = self.check_branch_enabled(tree.branch)
366
            if not nautilus_integration:
367
                return
368
369
            basis_tree = tree.basis_tree()
370
            intertree = InterTree.get(basis_tree, tree)
371
372
            basis_tree.lock_read()
373
            try:
374
                (status, emblem, file_revision) = self._file_summary(tree, basis_tree, intertree, path)
375
            finally:
376
                basis_tree.unlock()
377
            if emblem is not None:
378
                vfs_file.add_emblem(emblem)
379
            vfs_file.add_string_attribute('bzr_status', status)
380
            vfs_file.add_string_attribute('bzr_revision', file_revision)
381
        finally:
382
            tree.unlock()
454 by Martin Albisetti
Add the logic to enable/disable the plugin
383
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
384
    def check_branch_enabled(self, branch):
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
385
        # Supports global disable, but there is currently no UI to do this
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
386
        config = branch.get_config_stack()
387
        return config.get("nautilus_integration")
388
755 by Jelmer Vernooij
Add basic property page.
389
    def toggle_integration(self, menu, action, branch):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
390
        config = branch.get_config_stack()
391
        config.set("nautilus_integration", action)
755 by Jelmer Vernooij
Add basic property page.
392
393
    def get_property_pages(self, files):
394
        pages = []
395
        for vfs_file in files:
396
            try:
397
                controldir, path = self._open_bzrdir(vfs_file)
398
            except NotBranchError:
399
                continue
400
401
            try:
402
                tree = controldir.open_workingtree()
403
            except NoWorkingTree:
404
                continue
405
406
            tree.lock_read()
407
            try:
408
                file_id = tree.path2id(path)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
409
                pages.append(PropertyPageFile(tree, file_id, path))
410
                pages.append(PropertyPageBranch(tree.branch))
755 by Jelmer Vernooij
Add basic property page.
411
            finally:
412
                tree.unlock()
413
        return pages
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
414
415
416
class PropertyPageFile(Nautilus.PropertyPage):
417
418
    def __init__(self, tree, file_id, path):
419
        self.tree = tree
420
        self.file_id = file_id
421
        self.path = path
422
        label = Gtk.Label('File Version')
423
        label.show()
424
425
        table = self._create_table()
426
427
        super(PropertyPageFile, self).__init__(label=label,
428
            name="BzrNautilus::file_page", page=table)
429
430
    def _create_table(self):
431
        table = Gtk.Table(homogeneous=False, columns=2, rows=3)
432
433
        table.attach(Gtk.Label('File id:'), 0, 1, 0, 1)
434
        table.attach(Gtk.Label(self.file_id), 1, 2, 0, 1)
435
436
        table.attach(Gtk.Label('SHA1Sum:'), 0, 1, 1, 2)
437
        table.attach(Gtk.Label(self.tree.get_file_sha1(self.file_id, self.path)), 1, 1, 1, 2)
438
439
        basis_tree = self.tree.revision_tree(self.tree.last_revision())
440
        last_revision = basis_tree.get_file_revision(self.file_id)
441
442
        table.attach(Gtk.Label('Last Change Revision:'), 0, 1, 2, 3)
443
        revno = ".".join([str(x) for x in
444
            self.tree.branch.revision_id_to_dotted_revno(last_revision)])
445
        table.attach(Gtk.Label(revno), 1, 1, 2, 3)
446
447
        table.attach(Gtk.Label('Last Change Author:'), 0, 1, 3, 4)
448
        rev = self.tree.branch.repository.get_revision(last_revision)
449
        table.attach(Gtk.Label("\n".join(rev.get_apparent_authors())), 1, 1, 3, 4)
450
451
        table.show_all()
452
        return table
453
454
455
class PropertyPageBranch(Nautilus.PropertyPage):
456
457
    def __init__(self, branch):
458
        self.branch = branch
459
        label = Gtk.Label('Branch')
460
        label.show()
461
462
        table = self._create_table()
463
464
        super(PropertyPageBranch, self).__init__(label=label,
465
            name="BzrNautilus::branch_page", page=table)
466
467
    def _create_table(self):
468
        table = Gtk.Table(homogeneous=False, columns=2, rows=3)
469
470
        table.attach(Gtk.Label('Push location:'), 0, 1, 0, 1)
471
        table.attach(Gtk.Label(self.branch.get_push_location()), 1, 2, 0, 1)
472
473
        table.attach(Gtk.Label('Parent location:'), 0, 1, 1, 2)
474
        table.attach(Gtk.Label(self.branch.get_parent()), 1, 1, 1, 2)
475
476
        table.show_all()
477
        return table