/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
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
28
class cmd_gbranch(Command):
29
    """GTK+ branching.
30
    
31
    """
32
33
    def run(self):
34
        import pygtk
35
        pygtk.require("2.0")
36
        try:
37
            import gtk
38
        except RuntimeError, e:
39
            if str(e) == "could not open display":
40
                raise NoDisplayError
41
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
42
        from bzrlib.plugins.gtk.olive.branch import BranchDialog
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
43
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
44
        window = BranchDialog('.')
45
        window.display()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
46
47
register_command(cmd_gbranch)
48
49
class cmd_gdiff(Command):
50
    """Show differences in working tree in a GTK+ Window.
51
    
52
    Otherwise, all changes for the tree are listed.
53
    """
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
54
    takes_args = ['filename?']
58.1.1 by Aaron Bentley
gdiff takes -r arguments
55
    takes_options = ['revision']
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
56
57
    @display_command
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
58
    def run(self, revision=None, filename=None):
58.1.1 by Aaron Bentley
gdiff takes -r arguments
59
        wt = WorkingTree.open_containing(".")[0]
60
        branch = wt.branch
61
        if revision is not None:
62
            if len(revision) == 1:
63
                tree1 = wt
64
                revision_id = revision[0].in_history(branch).rev_id
65
                tree2 = branch.repository.revision_tree(revision_id)
66
            elif len(revision) == 2:
67
                revision_id_0 = revision[0].in_history(branch).rev_id
68
                tree2 = branch.repository.revision_tree(revision_id_0)
69
                revision_id_1 = revision[1].in_history(branch).rev_id
70
                tree1 = branch.repository.revision_tree(revision_id_1)
71
        else:
72
            tree1 = wt
73
            tree2 = tree1.basis_tree()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
74
93.1.8 by Alexander Belchenko
Fix absolute import in gdiff command.
75
        from viz.diffwin import DiffWindow
58 by Jelmer Vernooij
[merge] Home
76
        import gtk
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
77
        window = DiffWindow()
78
        window.connect("destroy", lambda w: gtk.main_quit())
79
        window.set_diff("Working Tree", tree1, tree2)
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
80
        if filename is not None:
93.1.16 by Alexander Belchenko
Partial fix for problem with encodings in diff window
81
            tree_filename = wt.relpath(filename)
59.2.4 by Aaron Bentley
Teach gdiff to accept a single file argument
82
            try:
83
                window.set_file(tree_filename)
84
            except NoSuchFile:
85
                if (tree1.inventory.path2id(tree_filename) is None and 
86
                    tree2.inventory.path2id(tree_filename) is None):
87
                    raise NotVersionedError(filename)
88
                raise BzrCommandError('No changes found for file "%s"' % 
89
                                      filename)
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
90
        window.show()
91
92
        gtk.main()
93
94
register_command(cmd_gdiff)
95
96
class cmd_visualise(Command):
97
    """Graphically visualise this branch.
98
99
    Opens a graphical window to allow you to see the history of the branch
100
    and relationships between revisions in a visual manner,
101
102
    The default starting point is latest revision on the branch, you can
103
    specify a starting point with -r revision.
104
    """
105
    takes_options = [
106
        "revision",
107
        Option('limit', "maximum number of revisions to display",
108
               int, 'count')]
109
    takes_args = [ "location?" ]
110
    aliases = [ "visualize", "vis", "viz" ]
111
112
    def run(self, location=".", revision=None, limit=None):
113
        (branch, path) = Branch.open_containing(location)
114
        branch.lock_read()
115
        branch.repository.lock_read()
116
        try:
117
            if revision is None:
118
                revid = branch.last_revision()
119
                if revid is None:
120
                    return
121
            else:
122
                (revno, revid) = revision[0].in_history(branch)
123
124
            from viz.bzrkapp import BzrkApp
125
                
126
            app = BzrkApp()
127
            app.show(branch, revid, limit)
128
        finally:
129
            branch.repository.unlock()
130
            branch.unlock()
131
        app.main()
132
133
134
register_command(cmd_visualise)
135
136
class cmd_gannotate(Command):
137
    """GTK+ annotate.
138
    
139
    Browse changes to FILENAME line by line in a GTK+ window.
140
    """
141
59.2.1 by Aaron Bentley
Gannotate takes a line number
142
    takes_args = ["filename", "line?"]
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
143
    takes_options = [
144
        Option("all", help="show annotations on all lines"),
145
        Option("plain", help="don't highlight annotation lines"),
146
        Option("line", type=int, argname="lineno",
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
147
               help="jump to specified line number"),
148
        "revision",
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
149
    ]
150
    aliases = ["gblame", "gpraise"]
151
    
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
152
    def run(self, filename, all=False, plain=False, line='1', revision=None):
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
153
        import pygtk
154
        pygtk.require("2.0")
155
156
        try:
157
            import gtk
158
        except RuntimeError, e:
159
            if str(e) == "could not open display":
160
                raise NoDisplayError
161
59.2.1 by Aaron Bentley
Gannotate takes a line number
162
        try:
163
            line = int(line)
164
        except ValueError:
165
            raise BzrCommandError('Line argument ("%s") is not a number.' % 
166
                                  line)
167
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
168
        from annotate.gannotate import GAnnotateWindow
169
        from annotate.config import GAnnotateConfig
170
66.2.18 by Aaron Bentley
Gannotate works with branches, not just trees
171
        try:
172
            (tree, path) = WorkingTree.open_containing(filename)
173
            branch = tree.branch
174
        except errors.NoWorkingTree:
175
            (branch, path) = Branch.open_containing(filename)
176
            tree = branch.basis_tree()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
177
66.2.18 by Aaron Bentley
Gannotate works with branches, not just trees
178
        file_id = tree.path2id(path)
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
179
180
        if file_id is None:
181
            raise NotVersionedError(filename)
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
182
        if revision is not None:
183
            if len(revision) != 1:
184
                raise BzrCommandError("Only 1 revion may be specified.")
185
            revision_id = revision[0].in_history(branch).rev_id
66.2.14 by Aaron Bentley
Annotate showing uncommitted changes
186
            tree = branch.repository.revision_tree(revision_id)
66.2.1 by Aaron Bentley
Gannotate takes a revision argument
187
        else:
66.2.18 by Aaron Bentley
Gannotate works with branches, not just trees
188
            revision_id = getattr(tree, 'get_revision_id', lambda: None)()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
189
190
        window = GAnnotateWindow(all, plain)
191
        window.connect("destroy", lambda w: gtk.main_quit())
192
        window.set_title(path + " - gannotate")
193
        config = GAnnotateConfig(window)
194
        window.show()
195
        branch.lock_read()
196
        try:
66.2.14 by Aaron Bentley
Annotate showing uncommitted changes
197
            window.annotate(tree, branch, file_id)
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
198
        finally:
199
            branch.unlock()
200
        window.jump_to_line(line)
201
        
202
        gtk.main()
203
204
register_command(cmd_gannotate)
205
206
class cmd_gcommit(Command):
207
    """GTK+ commit dialog
208
209
    Graphical user interface for committing revisions"""
210
    
211
    takes_args = []
212
    takes_options = []
213
214
    def run(self, filename=None):
93.1.17 by Alexander Belchenko
gcommit reworked again.
215
        import os
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
216
        import pygtk
217
        pygtk.require("2.0")
218
219
        try:
220
            import gtk
221
        except RuntimeError, e:
222
            if str(e) == "could not open display":
223
                raise NoDisplayError
224
90 by Jelmer Vernooij
Use Olive's clone dialog in nautilus-bzr; remove the old Clone dialog
225
        from olive.commit import CommitDialog
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
226
        from bzrlib.commit import Commit
93.1.17 by Alexander Belchenko
gcommit reworked again.
227
        from bzrlib.errors import (BzrCommandError,
228
                                   NotBranchError,
229
                                   NoWorkingTree,
230
                                   PointlessCommit,
231
                                   ConflictsInTree,
232
                                   StrictCommitFailed)
233
234
        wt = None
235
        branch = None
236
        try:
237
            (wt, path) = WorkingTree.open_containing(filename)
238
            branch = wt.branch
239
        except NotBranchError, e:
240
            path = e.path
241
        except NoWorkingTree, e:
242
            path = e.base
243
            try:
244
                (branch, path) = Branch.open_containing(path)
245
            except NotBranchError, e:
246
                path = e.path
247
248
        dialog = CommitDialog(wt, path, not branch)
249
        if dialog.display():
250
            dialog.window.connect("destroy", lambda w: gtk.main_quit())
251
            gtk.main()
55.1.2 by Jelmer Vernooij
Move commands to top-level __init__
252
253
register_command(cmd_gcommit)
254
255
class NoDisplayError(BzrCommandError):
256
    """gtk could not find a proper display"""
257
258
    def __str__(self):
259
        return "No DISPLAY. gannotate is disabled."