/tortoisehg/hgtk/bugreport.py

https://bitbucket.org/tortoisehg/hgtk/ · Python · 95 lines · 74 code · 11 blank · 10 comment · 8 complexity · 961c72b4f86b84dff05e7009e7abd9a4 MD5 · raw file

  1. # bugreport.py - Bug report dialog for TortoiseHg
  2. #
  3. # Copyright 2009 Steve Borho <steve@borho.org>
  4. #
  5. # This software may be used and distributed according to the terms of the
  6. # GNU General Public License version 2, incorporated herein by reference.
  7. import os, sys
  8. import gtk
  9. from mercurial import extensions
  10. from tortoisehg.util.i18n import _
  11. from tortoisehg.util import hglib, version
  12. from tortoisehg.hgtk import gdialog, gtklib
  13. class BugReport(gdialog.GWindow):
  14. """GTK+ based dialog for displaying traceback info to the user in a
  15. cut-paste friendly manner. And include a number of useful bit of
  16. information like version numbers, etc.
  17. """
  18. __error_text__ = None
  19. def get_title(self):
  20. return _('TortoiseHg Bug Report')
  21. def get_icon(self):
  22. return 'menudelete.ico'
  23. def get_body(self):
  24. textview = gtk.TextView()
  25. textview.set_wrap_mode(gtk.WRAP_NONE)
  26. textview.set_editable(False)
  27. textview.modify_font(self.fonts['diff'])
  28. scroller = gtk.ScrolledWindow()
  29. scroller.set_shadow_type(gtk.SHADOW_IN)
  30. scroller.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
  31. scroller.add(textview)
  32. scroller.set_border_width(5)
  33. vbox = gtk.VBox()
  34. vbox.pack_start(scroller, True, True, 2)
  35. hbbox = gtk.HButtonBox()
  36. hbbox.set_layout(gtk.BUTTONBOX_END)
  37. vbox.pack_start(hbbox, False, False, 2)
  38. save = gtk.Button(_('Save as..'))
  39. save.connect('clicked', self.save_report_clicked)
  40. hbbox.add(save)
  41. close = gtk.Button(_('Close'))
  42. close.connect('clicked', gtk.main_quit)
  43. hbbox.add(close)
  44. textview.get_buffer().set_text(self.get_error_text())
  45. return vbox
  46. def get_error_text(self):
  47. if self.__error_text__ == None:
  48. text = '{{{\n#!python\n' # Wrap in Bitbucket wiki preformat markers
  49. text += _('** Please report this bug to'
  50. ' http://bitbucket.org/tortoisehg/stable/issues\n')
  51. text += '** Mercurial version (%s). TortoiseHg version (%s)\n' % (
  52. hglib.hgversion, version.version())
  53. text += '** Command: %s\n' % (self.opts['cmd'])
  54. text += '** CWD: %s\n' % os.getcwd()
  55. extlist = [x[0] for x in extensions.extensions()]
  56. text += '** Extensions loaded: %s\n' % ', '.join(extlist)
  57. text += '** Python %s\n' % sys.version.replace('\n', '')
  58. if os.name == 'nt':
  59. text += '** sys.getwindowsversion(): %s\n' % str(sys.getwindowsversion())
  60. arch = 'unknown (failed to import win32api)'
  61. try:
  62. import win32api
  63. arch = 'unknown'
  64. archval = win32api.GetNativeSystemInfo()[0]
  65. if archval == 9:
  66. arch = 'x64'
  67. elif archval == 0:
  68. arch = 'x86'
  69. except (ImportError, AttributeError):
  70. pass
  71. text += '** Processor architecture: %s\n' % arch
  72. text += self.opts['error']
  73. text += '\n}}}'
  74. self.__error_text__ = text
  75. return self.__error_text__
  76. def save_report_clicked(self, button):
  77. result = gtklib.NativeSaveFileDialogWrapper(
  78. title=_('Save error report to')).run()
  79. if result:
  80. fd = file(result, 'w')
  81. fd.write(self.get_error_text())
  82. fd.close()
  83. def run(_ui, *pats, **opts):
  84. return BugReport(_ui, None, None, None, opts)