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