Kiln » TortoiseHg » TortoiseHg
Clone URL:  
bugreport.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
# bugreport.py - Bug report dialog for TortoiseHg # # Copyright 2009 Steve Borho <steve@borho.org> # # This software may be used and distributed according to the terms of the # GNU General Public License version 2, incorporated herein by reference. import os, sys import gtk from mercurial import extensions from tortoisehg.util.i18n import _ from tortoisehg.util import hglib, version from tortoisehg.hgtk import gdialog, gtklib class BugReport(gdialog.GWindow): """GTK+ based dialog for displaying traceback info to the user in a cut-paste friendly manner. And include a number of useful bit of information like version numbers, etc. """ __error_text__ = None def get_title(self): return _('TortoiseHg Bug Report') def get_icon(self): return 'menudelete.ico' def get_body(self): textview = gtk.TextView() textview.set_wrap_mode(gtk.WRAP_NONE) textview.set_editable(False) textview.modify_font(self.fonts['diff']) scroller = gtk.ScrolledWindow() scroller.set_shadow_type(gtk.SHADOW_IN) scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scroller.add(textview) scroller.set_border_width(5) vbox = gtk.VBox() vbox.pack_start(scroller, True, True, 2) hbbox = gtk.HButtonBox() hbbox.set_layout(gtk.BUTTONBOX_END) vbox.pack_start(hbbox, False, False, 2) save = gtk.Button(_('Save as..')) save.connect('clicked', self.save_report_clicked) hbbox.add(save) close = gtk.Button(_('Close')) close.connect('clicked', gtk.main_quit) hbbox.add(close) textview.get_buffer().set_text(self.get_error_text()) return vbox def get_error_text(self): if self.__error_text__ == None: text = '{{{\n#!python\n' # Wrap in Bitbucket wiki preformat markers text += _('** Please report this bug to ' 'http://bitbucket.org/tortoisehg/stable/issues\n') text += '** Mercurial version (%s). TortoiseHg version (%s)\n' % ( hglib.hgversion, version.version()) text += '** Command: %s\n' % (self.opts['cmd']) text += '** CWD: %s\n' % os.getcwd() extlist = [x[0] for x in extensions.extensions()] text += '** Extensions loaded: %s\n' % ', '.join(extlist) text += '** Python %s\n' % sys.version.replace('\n', '') if os.name == 'nt': text += '** sys.getwindowsversion(): %s\n' % str(sys.getwindowsversion()) arch = 'unknown (failed to import win32api)' try: import win32api arch = 'unknown' archval = win32api.GetNativeSystemInfo()[0] if archval == 9: arch = 'x64' elif archval == 0: arch = 'x86' except (ImportError, AttributeError): pass text += '** Processor architecture: %s\n' % arch text += self.opts['error'] text += '\n}}}' self.__error_text__ = text return self.__error_text__ def save_report_clicked(self, button): result = gtklib.NativeSaveFileDialogWrapper( title=_('Save error report to')).run() if result: fd = file(result, 'w') fd.write(self.get_error_text()) fd.close() def run(_ui, *pats, **opts): return BugReport(_ui, None, None, None, opts)