/tortoisehg/hgtk/bugtraq.py

https://bitbucket.org/tortoisehg/hgtk/ · Python · 169 lines · 146 code · 22 blank · 1 comment · 17 complexity · 55273e9a5b454d196c739b6c1604f38e MD5 · raw file

  1. from ctypes import *
  2. import comtypes
  3. import pythoncom
  4. from comtypes import IUnknown, GUID, COMMETHOD, POINTER
  5. from comtypes.typeinfo import ITypeInfo
  6. from comtypes.client import CreateObject
  7. from comtypes.automation import _midlSAFEARRAY
  8. from _winreg import *
  9. class IBugTraqProvider(IUnknown):
  10. _iid_ = GUID("{298B927C-7220-423C-B7B4-6E241F00CD93}")
  11. _methods_ = [
  12. COMMETHOD([], HRESULT, "ValidateParameters",
  13. (['in'], comtypes.c_long, "hParentWnd"),
  14. (['in'], comtypes.BSTR, "parameters"),
  15. (['out', 'retval'], POINTER(comtypes.c_int16), "pRetVal") ),
  16. COMMETHOD([], HRESULT, "GetLinkText",
  17. (['in'], comtypes.c_long, "hParentWnd"),
  18. (['in'], comtypes.BSTR, "parameters"),
  19. (['out', 'retval'], POINTER(comtypes.BSTR), "pRetVal") ),
  20. COMMETHOD([], HRESULT, "GetCommitMessage",
  21. (['in'], comtypes.c_long, "hParentWnd"),
  22. (['in'], comtypes.BSTR, "parameters"),
  23. (['in'], comtypes.BSTR, "commonRoot"),
  24. (['in'], _midlSAFEARRAY(comtypes.BSTR), "pathList"),
  25. (['in'], comtypes.BSTR, "originalMessage"),
  26. (['out', 'retval'], POINTER(comtypes.BSTR), "pRetVal") )
  27. ]
  28. class IBugTraqProvider2(IBugTraqProvider):
  29. _iid_ = GUID("{C5C85E31-2F9B-4916-A7BA-8E27D481EE83}")
  30. _methods_ = [
  31. COMMETHOD([], HRESULT, "GetCommitMessage2",
  32. (['in'], comtypes.c_long, "hParentWnd"),
  33. (['in'], comtypes.BSTR, "parameters"),
  34. (['in'], comtypes.BSTR, "commonURL"),
  35. (['in'], comtypes.BSTR, "commonRoot"),
  36. (['in'], _midlSAFEARRAY(comtypes.BSTR), "pathList"),
  37. (['in'], comtypes.BSTR, "originalMessage"),
  38. (['in'], comtypes.BSTR, "bugID"),
  39. (['out'], POINTER(comtypes.BSTR), "bugIDOut"),
  40. (['out'], POINTER(_midlSAFEARRAY(comtypes.BSTR)), "revPropNames"),
  41. (['out'], POINTER(_midlSAFEARRAY(comtypes.BSTR)), "revPropValues"),
  42. (['out', 'retval'], POINTER(comtypes.BSTR), "pRetVal") ),
  43. COMMETHOD([], HRESULT, "CheckCommit",
  44. (['in'], comtypes.c_long, "hParentWnd"),
  45. (['in'], comtypes.BSTR, "parameters"),
  46. (['in'], comtypes.BSTR, "commonURL"),
  47. (['in'], comtypes.BSTR, "commonRoot"),
  48. (['in'], _midlSAFEARRAY(comtypes.BSTR), "pathList"),
  49. (['in'], comtypes.BSTR, "commitMessage"),
  50. (['out', 'retval'], POINTER(comtypes.BSTR), "pRetVal") ),
  51. COMMETHOD([], HRESULT, "OnCommitFinished",
  52. (['in'], comtypes.c_long, "hParentWnd"),
  53. (['in'], comtypes.BSTR, "commonRoot"),
  54. (['in'], _midlSAFEARRAY(comtypes.BSTR), "pathList"),
  55. (['in'], comtypes.BSTR, "logMessage"),
  56. (['in'], comtypes.c_long, "revision"),
  57. (['out', 'retval'], POINTER(comtypes.BSTR), "pRetVal") ),
  58. COMMETHOD([], HRESULT, "HasOptions",
  59. (['out', 'retval'], POINTER(comtypes.c_int16), "pRetVal") ),
  60. COMMETHOD([], HRESULT, "ShowOptionsDialog",
  61. (['in'], comtypes.c_long, "hParentWnd"),
  62. (['in'], comtypes.BSTR, "parameters"),
  63. (['out', 'retval'], POINTER(comtypes.BSTR), "pRetVal") )
  64. ]
  65. class BugTraq:
  66. #svnjiraguid = "{CF732FD7-AA8A-4E9D-9E15-025E4D1A7E9D}"
  67. def __init__(self, guid):
  68. self.guid = guid
  69. self.bugtr = None
  70. def _get_bugtraq_object(self):
  71. if self.bugtr == None:
  72. obj = CreateObject(self.guid)
  73. self.bugtr = obj.QueryInterface(IBugTraqProvider2)
  74. return self.bugtr
  75. def get_commit_message(self, parameters, logmessage):
  76. commonurl = ""
  77. commonroot = ""
  78. bugid = ""
  79. bstrarray = _midlSAFEARRAY(comtypes.BSTR)
  80. pathlist = bstrarray.from_param(())
  81. bugtr = self._get_bugtraq_object()
  82. if self.supports_bugtraq2_interface():
  83. (bugid, revPropNames, revPropValues, newmessage) = bugtr.GetCommitMessage2(
  84. 0, parameters, commonurl, commonroot, pathlist, logmessage, bugid)
  85. else:
  86. newmessage = bugtr.GetCommitMessage(
  87. 0, parameters, commonroot, pathlist, logmessage)
  88. return newmessage
  89. def on_commit_finished(self, logmessage):
  90. if not self.supports_bugtraq2_interface():
  91. return ""
  92. commonroot = ""
  93. bstrarray = _midlSAFEARRAY(comtypes.BSTR)
  94. pathlist = bstrarray.from_param(())
  95. bugtr = self._get_bugtraq_object()
  96. errormessage = bugtr.OnCommitFinished(0, commonroot, pathlist,
  97. logmessage, 0)
  98. return errormessage
  99. def show_options_dialog(self, options):
  100. if not self.has_options():
  101. return ""
  102. bugtr = self._get_bugtraq_object()
  103. options = bugtr.ShowOptionsDialog(0, options)
  104. return options
  105. def has_options(self):
  106. if not self.supports_bugtraq2_interface():
  107. return False
  108. bugtr = self._get_bugtraq_object()
  109. return bugtr.HasOptions() != 0
  110. def get_link_text(self, parameters):
  111. bugtr = self._get_bugtraq_object()
  112. return bugtr.GetLinkText(0, parameters)
  113. def supports_bugtraq2_interface(self):
  114. bugtr = self._get_bugtraq_object()
  115. try:
  116. bugtr.HasOptions()
  117. return True
  118. except ValueError:
  119. return False
  120. def get_issue_plugins():
  121. cm = pythoncom.CoCreateInstance(pythoncom.CLSID_StdComponentCategoriesMgr,
  122. None, pythoncom.CLSCTX_INPROC,pythoncom.IID_ICatInformation)
  123. CATID_BugTraqProvider = pythoncom.MakeIID(
  124. "{3494FA92-B139-4730-9591-01135D5E7831}")
  125. ret = []
  126. enumerator = cm.EnumClassesOfCategories((CATID_BugTraqProvider,),())
  127. while 1:
  128. try:
  129. clsid = enumerator.Next()
  130. if clsid == ():
  131. break
  132. except pythoncom.com_error:
  133. break
  134. ret.extend(clsid)
  135. return ret
  136. def get_plugin_name(clsid):
  137. key = OpenKey(HKEY_CLASSES_ROOT, r"CLSID\%s" % clsid)
  138. try:
  139. keyvalue = QueryValueEx(key, None)[0]
  140. except WindowsError:
  141. keyvalue = None
  142. key.Close()
  143. return keyvalue
  144. def get_issue_plugins_with_names():
  145. pluginclsids = get_issue_plugins()
  146. keyandnames = [(key, get_plugin_name(key)) for key in pluginclsids]
  147. return [kn for kn in keyandnames if kn[1] is not None]