/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz
49 by Jelmer Vernooij
Merge in Dan Loda's gannotate plugin and put it in annotate/
1
# This program is free software; you can redistribute it and/or modify
2
# it under the terms of the GNU General Public License as published by
3
# the Free Software Foundation; either version 2 of the License, or
4
# (at your option) any later version.
5
6
# This program is distributed in the hope that it will be useful,
7
# but WITHOUT ANY WARRANTY; without even the implied warranty of
8
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9
# GNU General Public License for more details.
10
11
# You should have received a copy of the GNU General Public License
12
# along with this program; if not, write to the Free Software
13
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
14
15
"""GTK+ frontends to Bazaar commands """
73 by Jelmer Vernooij
Release 0.9, list myself as maintainer.
16
66.2.18 by Aaron Bentley
Gannotate works with branches, not just trees
17
from bzrlib import errors
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
18
from bzrlib.commands import Command, register_command, display_command
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
19
from bzrlib.errors import NotVersionedError, BzrCommandError, NoSuchFile
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
20
from bzrlib.commands import Command, register_command
21
from bzrlib.option import Option
22
from bzrlib.branch import Branch
23
from bzrlib.workingtree import WorkingTree
24
from bzrlib.bzrdir import BzrDir
25
66.2.12 by Jelmer Vernooij
Release 0.13.0.
26
__version__ = '0.13.0'
73 by Jelmer Vernooij
Release 0.9, list myself as maintainer.
27
66.2.20 by Aaron Bentley
Nicer error when PyGTK not installed
28
29
def import_pygtk():
30
    try:
31
        import pygtk
32
    except ImportError:
33
        raise errors.BzrCommandError("PyGTK not installed.")
34
    pygtk.require('2.0')
35
    return pygtk
36
37
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
38
class cmd_gbranch(Command):
39
    """GTK+ branching.
40
    
41
    """
42
43
    def run(self):
66.2.20 by Aaron Bentley
Nicer error when PyGTK not installed
44
        pygtk = import_pygtk()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
45
        try:
46
            import gtk
47
        except RuntimeError, e:
48
            if str(e) == "could not open display":
49
                raise NoDisplayError
50
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
51
        from bzrlib.plugins.gtk.olive.branch import BranchDialog
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
52
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
53
        window = BranchDialog('.')
54
        window.display()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
55
56
register_command(cmd_gbranch)
57
58
class cmd_gdiff(Command):
59
    """Show differences in working tree in a GTK+ Window.
60
    
61
    Otherwise, all changes for the tree are listed.
62
    """
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
63
    takes_args = ['filename?']
58.1.1 by Aaron Bentley
gdiff takes -r arguments
64
    takes_options = ['revision']
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
65
66
    @display_command
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
67
    def run(self, revision=None, filename=None):
58.1.1 by Aaron Bentley
gdiff takes -r arguments
68
        wt = WorkingTree.open_containing(".")[0]
69
        branch = wt.branch
70
        if revision is not None:
71
            if len(revision) == 1:
72
                tree1 = wt
73
                revision_id = revision[0].in_history(branch).rev_id
74
                tree2 = branch.repository.revision_tree(revision_id)
75
            elif len(revision) == 2:
76
                revision_id_0 = revision[0].in_history(branch).rev_id
77
                tree2 = branch.repository.revision_tree(revision_id_0)
78
                revision_id_1 = revision[1].in_history(branch).rev_id
79
                tree1 = branch.repository.revision_tree(revision_id_1)
80
        else:
81
            tree1 = wt
82
            tree2 = tree1.basis_tree()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
83
93.1.8 by Alexander Belchenko
Fix absolute import in gdiff command.
84
        from viz.diffwin import DiffWindow
58 by Jelmer Vernooij
[merge] Home
85
        import gtk
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
86
        window = DiffWindow()
87
        window.connect("destroy", lambda w: gtk.main_quit())
88
        window.set_diff("Working Tree", tree1, tree2)
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
89
        if filename is not None:
93.1.16 by Alexander Belchenko
Partial fix for problem with encodings in diff window
90
            tree_filename = wt.relpath(filename)
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
91
            try:
92
                window.set_file(tree_filename)
93
            except NoSuchFile:
94
                if (tree1.inventory.path2id(tree_filename) is None and 
95
                    tree2.inventory.path2id(tree_filename) is None):
96
                    raise NotVersionedError(filename)
97
                raise BzrCommandError('No changes found for file "%s"' % 
98
                                      filename)
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
99
        window.show()
100
101
        gtk.main()
102
103
register_command(cmd_gdiff)
104
105
class cmd_visualise(Command):
106
    """Graphically visualise this branch.
107
108
    Opens a graphical window to allow you to see the history of the branch
109
    and relationships between revisions in a visual manner,
110
111
    The default starting point is latest revision on the branch, you can
112
    specify a starting point with -r revision.
113
    """
114
    takes_options = [
115
        "revision",
116
        Option('limit', "maximum number of revisions to display",
117
               int, 'count')]
118
    takes_args = [ "location?" ]
119
    aliases = [ "visualize", "vis", "viz" ]
120
121
    def run(self, location=".", revision=None, limit=None):
122
        (branch, path) = Branch.open_containing(location)
123
        branch.lock_read()
124
        branch.repository.lock_read()
125
        try:
126
            if revision is None:
127
                revid = branch.last_revision()
128
                if revid is None:
129
                    return
130
            else:
131
                (revno, revid) = revision[0].in_history(branch)
132
133
            from viz.bzrkapp import BzrkApp
134
                
135
            app = BzrkApp()
136
            app.show(branch, revid, limit)
137
        finally:
138
            branch.repository.unlock()
139
            branch.unlock()
140
        app.main()
141
142
143
register_command(cmd_visualise)
144
145
class cmd_gannotate(Command):
146
    """GTK+ annotate.
147
    
148
    Browse changes to FILENAME line by line in a GTK+ window.
149
    """
150
59.2.1 by Aaron Bentley
Gannotate takes a line number
151
    takes_args = ["filename", "line?"]
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
152
    takes_options = [
153
        Option("all", help="show annotations on all lines"),
154
        Option("plain", help="don't highlight annotation lines"),
155
        Option("line", type=int, argname="lineno",
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
156
               help="jump to specified line number"),
157
        "revision",
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
158
    ]
159
    aliases = ["gblame", "gpraise"]
160
    
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
161
    def run(self, filename, all=False, plain=False, line='1', revision=None):
66.2.20 by Aaron Bentley
Nicer error when PyGTK not installed
162
        pygtk = import_pygtk()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
163
164
        try:
165
            import gtk
166
        except RuntimeError, e:
167
            if str(e) == "could not open display":
168
                raise NoDisplayError
169
59.2.1 by Aaron Bentley
Gannotate takes a line number
170
        try:
171
            line = int(line)
172
        except ValueError:
173
            raise BzrCommandError('Line argument ("%s") is not a number.' % 
174
                                  line)
175
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
176
        from annotate.gannotate import GAnnotateWindow
177
        from annotate.config import GAnnotateConfig
178
66.2.18 by Aaron Bentley
Gannotate works with branches, not just trees
179
        try:
180
            (tree, path) = WorkingTree.open_containing(filename)
181
            branch = tree.branch
182
        except errors.NoWorkingTree:
183
            (branch, path) = Branch.open_containing(filename)
184
            tree = branch.basis_tree()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
185
66.2.18 by Aaron Bentley
Gannotate works with branches, not just trees
186
        file_id = tree.path2id(path)
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
187
188
        if file_id is None:
189
            raise NotVersionedError(filename)
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
190
        if revision is not None:
191
            if len(revision) != 1:
192
                raise BzrCommandError("Only 1 revion may be specified.")
193
            revision_id = revision[0].in_history(branch).rev_id
66.2.14 by Aaron Bentley
Annotate showing uncommitted changes
194
            tree = branch.repository.revision_tree(revision_id)
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
195
        else:
66.2.18 by Aaron Bentley
Gannotate works with branches, not just trees
196
            revision_id = getattr(tree, 'get_revision_id', lambda: None)()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
197
198
        window = GAnnotateWindow(all, plain)
199
        window.connect("destroy", lambda w: gtk.main_quit())
200
        window.set_title(path + " - gannotate")
201
        config = GAnnotateConfig(window)
202
        window.show()
203
        branch.lock_read()
204
        try:
66.2.14 by Aaron Bentley
Annotate showing uncommitted changes
205
            window.annotate(tree, branch, file_id)
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
206
        finally:
207
            branch.unlock()
208
        window.jump_to_line(line)
209
        
210
        gtk.main()
211
212
register_command(cmd_gannotate)
213
214
class cmd_gcommit(Command):
215
    """GTK+ commit dialog
216
217
    Graphical user interface for committing revisions"""
218
    
219
    takes_args = []
220
    takes_options = []
221
222
    def run(self, filename=None):
93.1.17 by Alexander Belchenko
gcommit reworked again.
223
        import os
66.2.20 by Aaron Bentley
Nicer error when PyGTK not installed
224
        pygtk = import_pygtk()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
225
226
        try:
227
            import gtk
228
        except RuntimeError, e:
229
            if str(e) == "could not open display":
230
                raise NoDisplayError
231
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
232
        from olive.commit import CommitDialog
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
233
        from bzrlib.commit import Commit
93.1.17 by Alexander Belchenko
gcommit reworked again.
234
        from bzrlib.errors import (BzrCommandError,
235
                                   NotBranchError,
236
                                   NoWorkingTree,
237
                                   PointlessCommit,
238
                                   ConflictsInTree,
239
                                   StrictCommitFailed)
240
241
        wt = None
242
        branch = None
243
        try:
244
            (wt, path) = WorkingTree.open_containing(filename)
245
            branch = wt.branch
246
        except NotBranchError, e:
247
            path = e.path
248
        except NoWorkingTree, e:
249
            path = e.base
250
            try:
251
                (branch, path) = Branch.open_containing(path)
252
            except NotBranchError, e:
253
                path = e.path
254
255
        dialog = CommitDialog(wt, path, not branch)
256
        if dialog.display():
257
            dialog.window.connect("destroy", lambda w: gtk.main_quit())
258
            gtk.main()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
259
260
register_command(cmd_gcommit)
261
262
class NoDisplayError(BzrCommandError):
263
    """gtk could not find a proper display"""
264
265
    def __str__(self):
266
        return "No DISPLAY. gannotate is disabled."