Kiln » TortoiseHg » TortoiseHg
Clone URL:  
backout.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# # backout.py - TortoiseHg's dialog for backing out changeset # # Copyright (C) 2008 Steve Borho <steve@borho.org> # Copyright (C) 2007 TK Soh <teekaysoh@gmail.com> # import os import gtk import gobject import pango from mercurial.i18n import _ from mercurial import hg, ui import shlib import hglib class BackoutDialog(gtk.Window): """ Backout effect of a changeset """ def __init__(self, rev=None): """ Initialize the Dialog """ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) shlib.set_tortoise_keys(self) self.set_title(_('Backout changeset - ') + rev) self.set_default_size(600, 400) self.notify_func = None try: repo = hg.repository(ui.ui(), path=hglib.rootpath()) except hglib.RepoError: gobject.idle_add(self.destroy) return vbox = gtk.VBox() self.add(vbox) frame = gtk.Frame(_('Changeset Description')) lbl = gtk.Label() desc = self.revdesc(repo, rev) lbl.set_markup(desc) lbl.set_alignment(0, 0) frame.add(lbl) frame.set_border_width(5) vbox.pack_start(frame, False, False, 2) self.logview = gtk.TextView(buffer=None) self.logview.set_editable(True) self.logview.modify_font(pango.FontDescription('Monospace')) buf = self.logview.get_buffer() buf.set_text(_('Backed out changeset: ') + rev) scrolledwindow = gtk.ScrolledWindow() scrolledwindow.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolledwindow.add(self.logview) scrolledwindow.set_border_width(4) frame = gtk.Frame(_('Backout commit message')) frame.set_border_width(4) frame.add(scrolledwindow) self.tips = gtk.Tooltips() self.tips.set_tip(frame, _('Commit message text for new changeset that reverses the' ' effect of the change being backed out.')) vbox.pack_start(frame, True, True, 4) accelgroup = gtk.AccelGroup() self.add_accel_group(accelgroup) mod = shlib.get_thg_modifier() hbbox = gtk.HButtonBox() hbbox.set_layout(gtk.BUTTONBOX_END) vbox.pack_start(hbbox, False, False, 2) close = gtk.Button(_('Close')) close.connect('clicked', lambda x: self.destroy()) key, modifier = gtk.accelerator_parse('Escape') close.add_accelerator('clicked', accelgroup, key, 0, gtk.ACCEL_VISIBLE) hbbox.add(close) backout = gtk.Button(_('Backout')) key, modifier = gtk.accelerator_parse(mod+'Return') backout.add_accelerator('clicked', accelgroup, key, modifier, gtk.ACCEL_VISIBLE) hbbox.add(backout) backout.grab_focus() backout.connect('clicked', self.backout, buf, rev) def revdesc(self, repo, revid): ctx = repo.changectx(revid) revstr = str(ctx.rev()) summary = ctx.description().replace('\0', '') summary = summary.split('\n')[0] escape = gobject.markup_escape_text desc = '<b>rev</b>\t\t: %s\n' % escape(revstr) desc += '<b>summary</b>\t: %s\n' % escape(summary[:80]) desc += '<b>user</b>\t\t: %s\n' % escape(ctx.user()) desc += '<b>date</b>\t\t: %s\n' % escape(hglib.displaytime(ctx.date())) node = repo.lookup(revid) tags = repo.nodetags(node) desc += '<b>branch</b>\t: ' + escape(ctx.branch()) if tags: desc += '\n<b>tags</b>\t\t: ' + escape(', '.join(tags)) return hglib.toutf(desc) def set_notify_func(self, func, *args): self.notify_func = func self.notify_args = args def backout(self, button, buf, rev): start, end = buf.get_bounds() msg = buf.get_text(start, end) cmdline = ['hg', 'backout', '--rev', self.reventry.get_text(), '--message', msg] from hgcmd import CmdDialog dlg = CmdDialog(cmdline) dlg.show_all() dlg.run() dlg.hide() if self.notify_func: self.notify_func(self.notify_args)