3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""GTK+ frontends to Bazaar commands """
18
from bzrlib.commands import Command, register_command, display_command
19
from bzrlib.errors import NotVersionedError, BzrCommandError
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
26
class cmd_gbranch(Command):
36
except RuntimeError, e:
37
if str(e) == "could not open display":
40
from clone import CloneDialog
42
window = CloneDialog()
43
if window.run() == gtk.RESPONSE_OK:
44
bzrdir = BzrDir.open(window.url)
45
bzrdir.sprout(window.dest_path)
47
register_command(cmd_gbranch)
49
class cmd_gdiff(Command):
50
"""Show differences in working tree in a GTK+ Window.
52
Otherwise, all changes for the tree are listed.
55
takes_options = ['revision']
58
def run(self, revision=None, file_list=None):
59
wt = WorkingTree.open_containing(".")[0]
61
if revision is not None:
62
if len(revision) == 1:
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)
73
tree2 = tree1.basis_tree()
75
from bzrlib.plugins.gtk.viz.diffwin import DiffWindow
78
window.connect("destroy", lambda w: gtk.main_quit())
79
window.set_diff("Working Tree", tree1, tree2)
84
register_command(cmd_gdiff)
86
class cmd_visualise(Command):
87
"""Graphically visualise this branch.
89
Opens a graphical window to allow you to see the history of the branch
90
and relationships between revisions in a visual manner,
92
The default starting point is latest revision on the branch, you can
93
specify a starting point with -r revision.
97
Option('limit', "maximum number of revisions to display",
99
takes_args = [ "location?" ]
100
aliases = [ "visualize", "vis", "viz" ]
102
def run(self, location=".", revision=None, limit=None):
103
(branch, path) = Branch.open_containing(location)
105
branch.repository.lock_read()
108
revid = branch.last_revision()
112
(revno, revid) = revision[0].in_history(branch)
114
from viz.bzrkapp import BzrkApp
117
app.show(branch, revid, limit)
119
branch.repository.unlock()
124
register_command(cmd_visualise)
126
class cmd_gannotate(Command):
129
Browse changes to FILENAME line by line in a GTK+ window.
132
takes_args = ["filename"]
134
Option("all", help="show annotations on all lines"),
135
Option("plain", help="don't highlight annotation lines"),
136
Option("line", type=int, argname="lineno",
137
help="jump to specified line number")
139
aliases = ["gblame", "gpraise"]
141
def run(self, filename, all=False, plain=False, line=1):
147
except RuntimeError, e:
148
if str(e) == "could not open display":
151
from annotate.gannotate import GAnnotateWindow
152
from annotate.config import GAnnotateConfig
154
(wt, path) = WorkingTree.open_containing(filename)
157
file_id = wt.path2id(path)
160
raise NotVersionedError(filename)
162
window = GAnnotateWindow(all, plain)
163
window.connect("destroy", lambda w: gtk.main_quit())
164
window.set_title(path + " - gannotate")
165
config = GAnnotateConfig(window)
169
window.annotate(branch, file_id)
172
window.jump_to_line(line)
176
register_command(cmd_gannotate)
178
class cmd_gcommit(Command):
179
"""GTK+ commit dialog
181
Graphical user interface for committing revisions"""
186
def run(self, filename=None):
192
except RuntimeError, e:
193
if str(e) == "could not open display":
196
from commit import GCommitDialog
197
from bzrlib.commit import Commit
198
from bzrlib.errors import (BzrCommandError, PointlessCommit, ConflictsInTree,
201
(wt, path) = WorkingTree.open_containing(filename)
204
file_id = wt.path2id(path)
207
raise NotVersionedError(filename)
209
dialog = GCommitDialog(wt)
210
dialog.set_title(path + " - Commit")
211
if dialog.run() != gtk.RESPONSE_CANCEL:
212
Commit().commit(working_tree=wt,message=dialog.message,
213
specific_files=dialog.specific_files)
215
register_command(cmd_gcommit)
217
class NoDisplayError(BzrCommandError):
218
"""gtk could not find a proper display"""
221
return "No DISPLAY. gannotate is disabled."