/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
755 by Jelmer Vernooij
Add basic property page.
127
    def merge_cb(self, menu, tree, path=None):
142 by Jelmer Vernooij
Move some files to the top-level directory, add first test.
128
        from bzrlib.plugins.gtk.merge import MergeDialog
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
129
        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.
130
        dialog.run()
578 by Jelmer Vernooij
Merge nautilus improvements.
131
        dialog.destroy()
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
132
755 by Jelmer Vernooij
Add basic property page.
133
    def create_tree_cb(self, menu, controldir):
134
        controldir.create_workingtree()
135
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
136
    def get_background_items(self, window, vfs_file):
137
        try:
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
138
            controldir, path = self._open_bzrdir(vfs_file)
139
        except NotBranchError:
419 by Szilveszter Farkas
Applied nautilus-bzr patches by Toshio Kuratomi.
140
            return
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
141
        try:
142
            branch = controldir.open_branch()
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
143
        except NotBranchError:
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
144
            items = []
754 by Jelmer Vernooij
Fix context menus.
145
            item = Nautilus.MenuItem(name='BzrNautilus::newtree',
146
                                 label='Make directory versioned',
147
                                 tip='Create new Bazaar tree in this folder',
148
                                 icon='')
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
149
            item.connect('activate', self.newtree_cb, vfs_file)
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
150
            items.append(item)
151
754 by Jelmer Vernooij
Fix context menus.
152
            item = Nautilus.MenuItem(name='BzrNautilus::clone',
153
                                 label='Checkout Bazaar branch ...',
154
                                 tip='Checkout Existing Bazaar Branch',
155
                                 icon='')
0.5.16 by Jelmer Vernooij
Adapt to bzr-gtk's API changes, add 'Clone' dialog
156
            item.connect('activate', self.clone_cb, vfs_file)
157
            items.append(item)
158
            return items
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
159
160
        items = []
161
162
        nautilus_integration = self.check_branch_enabled(branch)
163
        if not nautilus_integration:
754 by Jelmer Vernooij
Fix context menus.
164
            item = Nautilus.MenuItem(name='BzrNautilus::enable',
165
                                     label='Enable Bazaar Plugin for this Branch',
166
                                     tip='Enable Bazaar plugin for nautilus',
167
                                     icon='')
755 by Jelmer Vernooij
Add basic property page.
168
            item.connect('activate', self.toggle_integration, True, branch)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
169
            return [item]
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
170
        else:
754 by Jelmer Vernooij
Fix context menus.
171
            item = Nautilus.MenuItem(name='BzrNautilus::disable',
172
                                     label='Disable Bazaar Plugin this Branch',
173
                                     tip='Disable Bazaar plugin for nautilus',
174
                                     icon='')
755 by Jelmer Vernooij
Add basic property page.
175
            item.connect('activate', self.toggle_integration, False, branch)
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
176
            items.append(item)
0.5.8 by jbailey at ubuntu
Add bzrk plugin
177
754 by Jelmer Vernooij
Fix context menus.
178
        item = Nautilus.MenuItem(name='BzrNautilus::log',
179
                             label='History ...',
180
                             tip='Show Bazaar history',
181
                             icon='')
755 by Jelmer Vernooij
Add basic property page.
182
        item.connect('activate', self.log_cb, controldir)
81 by Jelmer Vernooij
Remove unnecessary "#!/usr/bin/python" shebang lines (fixes #59125).
183
        items.append(item)
0.5.15 by Jelmer Vernooij
Add 'Commit' entries
184
754 by Jelmer Vernooij
Fix context menus.
185
        item = Nautilus.MenuItem(name='BzrNautilus::pull',
186
                             label='Pull ...',
187
                             tip='Pull from another branch',
188
                             icon='')
755 by Jelmer Vernooij
Add basic property page.
189
        item.connect('activate', self.pull_cb, controldir)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
190
        items.append(item)
191
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
192
        try:
193
            tree = controldir.open_workingtree()
194
        except NoWorkingTree:
754 by Jelmer Vernooij
Fix context menus.
195
            item = Nautilus.MenuItem(name='BzrNautilus::create_tree',
196
                                 label='Create working tree...',
197
                                 tip='Create a working tree for this branch',
198
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
199
            item.connect('activate', self.create_tree_cb, controldir)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
200
            items.append(item)
201
        else:
754 by Jelmer Vernooij
Fix context menus.
202
            item = Nautilus.MenuItem(name='BzrNautilus::merge',
203
                                 label='Merge ...',
204
                                 tip='Merge from another branch',
205
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
206
            item.connect('activate', self.merge_cb, tree, path)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
207
            items.append(item)
91.1.4 by Jelmer Vernooij
List pull and merge in nautilus-bzr.
208
754 by Jelmer Vernooij
Fix context menus.
209
            item = Nautilus.MenuItem(name='BzrNautilus::commit',
210
                                 label='Commit ...',
211
                                 tip='Commit Changes',
212
                                 icon='')
755 by Jelmer Vernooij
Add basic property page.
213
            item.connect('activate', self.commit_cb, tree, path)
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
214
            items.append(item)
0.5.15 by Jelmer Vernooij
Add 'Commit' entries
215
216
        return items
0.5.7 by jbailey at ubuntu
Add hook for creating new bzr trees.
217
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
218
    def _get_file_menuitems(self, tree, intertree, path):
219
        file_id = tree.path2id(path)
220
        if file_id is None:
221
            item = Nautilus.MenuItem(name='BzrNautilus::add',
222
                                 label='Add',
223
                                 tip='Add as versioned file',
224
                                 icon='')
225
            item.connect('activate', self.add_cb, tree, path)
226
            yield item
227
228
            item = Nautilus.MenuItem(name='BzrNautilus::ignore',
229
                                 label='Ignore',
230
                                 tip='Ignore file for versioning',
231
                                 icon='')
232
            item.connect('activate', self.ignore_cb, tree, path)
233
            yield item
234
        elif tree.is_ignored(path):
235
            item = Nautilus.MenuItem(name='BzrNautilus::unignore',
236
                                 label='Unignore',
237
                                 tip='Unignore file for versioning',
238
                                 icon='')
239
            item.connect('activate', self.unignore_cb, tree, path)
240
            yield item
241
        else:
242
            item = Nautilus.MenuItem(name='BzrNautilus::log',
243
                             label='History ...',
244
                             tip='List changes',
245
                             icon='')
246
            item.connect('activate', self.log_cb, tree.bzrdir, path)
247
            yield item
248
249
            if not intertree.file_content_matches(file_id, file_id):
250
                item = Nautilus.MenuItem(name='BzrNautilus::diff',
251
                                 label='View Changes ...',
252
                                 tip='Show differences',
253
                                 icon='')
254
                item.connect('activate', self.diff_cb, tree, path)
255
                yield item
256
257
                item = Nautilus.MenuItem(name='BzrNautilus::commit',
258
                             label='Commit ...',
259
                             tip='Commit Changes',
260
                             icon='')
261
                item.connect('activate', self.commit_cb, tree, path)
262
                yield item
263
264
            item = Nautilus.MenuItem(name='BzrNautilus::remove',
265
                                 label='Remove',
266
                                 tip='Remove this file from versioning',
267
                                 icon='')
268
            item.connect('activate', self.remove_cb, tree, path)
269
            yield item
270
271
            item = Nautilus.MenuItem(name='BzrNautilus::annotate',
272
                         label='Annotate ...',
273
                         tip='Annotate File Data',
274
                         icon='')
275
            item.connect('activate', self.annotate_cb, tree, path, file_id)
276
            yield item
277
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
278
    def get_file_items(self, window, files):
279
        items = []
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
280
        trees = {}
281
282
        try:
283
            for vfs_file in files:
284
                controldir, path = self._open_bzrdir(vfs_file)
285
286
                try:
287
                    tree = trees[controldir.user_url]
288
                except KeyError:
289
                    try:
290
                        tree = controldir.open_workingtree()
291
                    except NoWorkingTree:
292
                        continue
293
                    trees[controldir.user_url] = tree
294
                    tree.lock_read()
295
296
                nautilus_integration = self.check_branch_enabled(tree.branch)
297
                if not nautilus_integration:
298
                    continue
0.5.2 by jbailey at ubuntu
Bring this to a state where it actually works. Specifically:
299
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
300
                intertree = InterTree.get(tree.basis_tree(), tree)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
301
                items.extend(list(self._get_file_menuitems(tree, intertree, path)))
302
        finally:
303
            for tree in trees.itervalues():
304
                tree.unlock()
305
0.5.1 by Jelmer Vernooij
Start working on bzr integration plugin for nautilus
306
        return items
88 by Jelmer Vernooij
Show column with file status.
307
308
    def get_columns(self):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
309
        return [
310
            Nautilus.Column(name="BzrNautilus::bzr_status",
311
                            attribute="bzr_status",
312
                            label="Status",
313
                            description="Version control status"),
314
            Nautilus.Column(name="BzrNautilus::bzr_revision",
315
                            attribute="bzr_revision",
316
                            label="Revision",
317
                            description="Last change revision"),
318
            ]
88 by Jelmer Vernooij
Show column with file status.
319
753 by Jelmer Vernooij
Fix columns.
320
    def _file_summary(self, tree, basis_tree, intertree, path):
321
        file_revision = ""
88 by Jelmer Vernooij
Show column with file status.
322
        emblem = None
323
753 by Jelmer Vernooij
Fix columns.
324
        file_id = tree.path2id(path)
325
        if file_id is None:
658.1.1 by Lucas Shrewsbury
Fix #294632 by adding ignored emblem and correct status.
326
            if tree.is_ignored(path):
327
                status = 'ignored'
328
                emblem = 'bzr-ignored'
329
            else:
330
                status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
331
            file_revision = "N/A"
332
        elif tree.has_filename(path): # Still present
333
            if not intertree.file_content_matches(file_id, file_id):
334
                if not basis_tree.has_id(file_id):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
335
                    emblem = 'bzr-added'
88 by Jelmer Vernooij
Show column with file status.
336
                    status = 'added'
753 by Jelmer Vernooij
Fix columns.
337
                    file_revision = "new file"
338
                elif basis_tree.path2id(file_id) != path:
339
                    status = 'bzr-renamed'
340
                    status = 'renamed from %s' % basis_tree.path2id(file_id)
341
                else:
342
                    emblem = 'bzr-modified'
343
                    status = 'modified'
344
            else:
345
                emblem = 'bzr-controlled'
346
                status = 'unchanged'
347
        elif basis_tree.has_filename(path):
423.13.5 by Jelmer Vernooij
Change emblems to the new emblems submitted by Martin.
348
            emblem = 'bzr-removed'
88 by Jelmer Vernooij
Show column with file status.
349
            status = 'removed'
350
        else:
351
            # FIXME: Check for ignored files
352
            status = 'unversioned'
753 by Jelmer Vernooij
Fix columns.
353
        return (status, emblem, file_revision)
354
355
    def update_file_info(self, vfs_file):
356
        try:
357
            controldir, path = self._open_bzrdir(vfs_file)
358
        except NotBranchError:
359
            return
360
361
        try:
362
            tree = controldir.open_workingtree()
363
        except NoWorkingTree:
364
            return
365
366
        tree.lock_read()
367
        try:
368
            nautilus_integration = self.check_branch_enabled(tree.branch)
369
            if not nautilus_integration:
370
                return
371
372
            basis_tree = tree.basis_tree()
373
            intertree = InterTree.get(basis_tree, tree)
374
375
            basis_tree.lock_read()
376
            try:
377
                (status, emblem, file_revision) = self._file_summary(tree, basis_tree, intertree, path)
378
            finally:
379
                basis_tree.unlock()
380
            if emblem is not None:
381
                vfs_file.add_emblem(emblem)
382
            vfs_file.add_string_attribute('bzr_status', status)
383
            vfs_file.add_string_attribute('bzr_revision', file_revision)
384
        finally:
385
            tree.unlock()
454 by Martin Albisetti
Add the logic to enable/disable the plugin
386
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
387
    def check_branch_enabled(self, branch):
459 by Martin Albisetti
Change nautilus enable/disable to per branch basis
388
        # Supports global disable, but there is currently no UI to do this
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
389
        config = branch.get_config_stack()
390
        return config.get("nautilus_integration")
391
755 by Jelmer Vernooij
Add basic property page.
392
    def toggle_integration(self, menu, action, branch):
752 by Jelmer Vernooij
Initial work on fixing nautilus-bzr.
393
        config = branch.get_config_stack()
394
        config.set("nautilus_integration", action)
755 by Jelmer Vernooij
Add basic property page.
395
396
    def get_property_pages(self, files):
397
        pages = []
398
        for vfs_file in files:
399
            try:
400
                controldir, path = self._open_bzrdir(vfs_file)
401
            except NotBranchError:
402
                continue
403
404
            try:
405
                tree = controldir.open_workingtree()
406
            except NoWorkingTree:
407
                continue
408
409
            tree.lock_read()
410
            try:
411
                file_id = tree.path2id(path)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
412
                pages.append(PropertyPageFile(tree, file_id, path))
413
                pages.append(PropertyPageBranch(tree.branch))
755 by Jelmer Vernooij
Add basic property page.
414
            finally:
415
                tree.unlock()
416
        return pages
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
417
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
418
    def get_widget(self, uri, window):
419
        controldir, path = ControlDir.open_containing(uri)
420
        try:
421
            tree = controldir.open_workingtree()
422
        except NoWorkingTree:
423
            return
424
        ret = Gtk.HBox(False, 4)
425
        text = 'This is a Bazaar working tree. '
426
        get_shelf_manager = getattr(tree, 'get_shelf_manager', None)
427
        if get_shelf_manager is not None:
428
            manager = get_shelf_manager()
429
            shelves = manager.active_shelves()
430
            if len(shelves) == 0:
431
                pass
432
            elif len(shelves) == 1:
433
                text += '1 shelf exists. '
434
            else:
435
                text += '%d shelf exists. ' % len(shelves)
436
        label = Gtk.Label(text)
437
        label.show()
438
        ret.pack_start(label, True, True, 0)
439
        ret.show_all()
440
        return ret
441
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
442
443
class PropertyPageFile(Nautilus.PropertyPage):
444
445
    def __init__(self, tree, file_id, path):
446
        self.tree = tree
447
        self.file_id = file_id
448
        self.path = path
449
        label = Gtk.Label('File Version')
450
        label.show()
451
452
        table = self._create_table()
453
454
        super(PropertyPageFile, self).__init__(label=label,
455
            name="BzrNautilus::file_page", page=table)
456
457
    def _create_table(self):
458
        table = Gtk.Table(homogeneous=False, columns=2, rows=3)
459
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
460
        table.attach(Gtk.Label(_i18n('File id:')), 0, 1, 0, 1)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
461
        table.attach(Gtk.Label(self.file_id), 1, 2, 0, 1)
462
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
463
        table.attach(Gtk.Label(_i18n('SHA1Sum:')), 0, 1, 1, 2)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
464
        table.attach(Gtk.Label(self.tree.get_file_sha1(self.file_id, self.path)), 1, 1, 1, 2)
465
466
        basis_tree = self.tree.revision_tree(self.tree.last_revision())
467
        last_revision = basis_tree.get_file_revision(self.file_id)
468
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
469
        table.attach(Gtk.Label(_i18n('Last Change Revision:')), 0, 1, 2, 3)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
470
        revno = ".".join([str(x) for x in
471
            self.tree.branch.revision_id_to_dotted_revno(last_revision)])
472
        table.attach(Gtk.Label(revno), 1, 1, 2, 3)
473
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
474
        table.attach(Gtk.Label(_i18n('Last Change Author:')), 0, 1, 3, 4)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
475
        rev = self.tree.branch.repository.get_revision(last_revision)
476
        table.attach(Gtk.Label("\n".join(rev.get_apparent_authors())), 1, 1, 3, 4)
477
478
        table.show_all()
479
        return table
480
481
482
class PropertyPageBranch(Nautilus.PropertyPage):
483
484
    def __init__(self, branch):
485
        self.branch = branch
486
        label = Gtk.Label('Branch')
487
        label.show()
488
489
        table = self._create_table()
490
491
        super(PropertyPageBranch, self).__init__(label=label,
492
            name="BzrNautilus::branch_page", page=table)
493
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
494
    def _create_location_entry(self, get_location, set_location):
495
        location = get_location()
496
        ret = Gtk.Entry()
497
        if location is not None:
498
            ret.set_text(location)
499
        return ret
500
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
501
    def _create_table(self):
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
502
        table = Gtk.Table(homogeneous=False, columns=2, rows=6)
503
504
        self._push_location_entry = self._create_location_entry(
505
            self.branch.get_push_location, self.branch.set_push_location)
506
        self._parent_location_entry = self._create_location_entry(
507
            self.branch.get_parent, self.branch.set_parent)
508
        self._bound_location_entry = self._create_location_entry(
509
            self.branch.get_bound_location, self.branch.set_bound_location)
510
        self._public_location_entry = self._create_location_entry(
511
            self.branch.get_public_branch, self.branch.set_public_branch)
512
        self._submit_location_entry = self._create_location_entry(
513
            self.branch.get_submit_branch, self.branch.set_submit_branch)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
514
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
515
        table.attach(Gtk.Label(_i18n('Push location:')), 0, 1, 0, 1)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
516
        table.attach(self._push_location_entry, 1, 2, 0, 1)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
517
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
518
        table.attach(Gtk.Label(_i18n('Parent location:')), 0, 1, 1, 2)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
519
        table.attach(self._parent_location_entry, 1, 1, 1, 2)
520
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
521
        table.attach(Gtk.Label(_i18n('Bound location:')), 0, 1, 2, 3)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
522
        table.attach(self._bound_location_entry, 1, 1, 2, 3)
523
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
524
        table.attach(Gtk.Label(_i18n('Public location:')), 0, 1, 3, 4)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
525
        table.attach(self._public_location_entry, 1, 1, 3, 4)
526
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
527
        table.attach(Gtk.Label(_i18n('Submit location:')), 0, 1, 4, 5)
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
528
        table.attach(self._submit_location_entry, 1, 1, 4, 5)
529
760 by Jelmer Vernooij
Use translations in nautilus-bzr.
530
        self._append_revisions_only = Gtk.CheckButton(_i18n('Append revisions only'))
759 by Jelmer Vernooij
Extend branch preferences, show location widget.
531
        value = self.branch.get_append_revisions_only()
532
        if value is None:
533
            value = False
534
        self._append_revisions_only.set_active(value)
535
        table.attach(self._append_revisions_only, 0, 2, 5, 6)
756 by Jelmer Vernooij
Add branch property page in nautilus-bzr.
536
537
        table.show_all()
538
        return table