/tortoisehg/hgqt/p4pending.py

https://bitbucket.org/tortoisehg/hgtk/ · Python · 124 lines · 98 code · 20 blank · 6 comment · 9 complexity · 30b6518fae58b28a7d98186d24bb2277 MD5 · raw file

  1. # p4pending.py - Display pending p4 changelists, created by perfarce extension
  2. #
  3. # Copyright 2010 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
  8. from PyQt4.QtCore import *
  9. from PyQt4.QtGui import *
  10. from mercurial import error
  11. from tortoisehg.util import hglib
  12. from tortoisehg.hgqt.i18n import _
  13. from tortoisehg.hgqt import qtlib, cslist, cmdui
  14. class PerforcePending(QDialog):
  15. 'Dialog for selecting a revision'
  16. output = pyqtSignal(QString, QString)
  17. makeLogVisible = pyqtSignal(bool)
  18. showMessage = pyqtSignal(unicode)
  19. def __init__(self, repo, pending, url, parent):
  20. QDialog.__init__(self, parent)
  21. self.repo = repo
  22. self.url = url
  23. self.pending = pending # dict of changelist -> hash tuple
  24. layout = QVBoxLayout()
  25. self.setLayout(layout)
  26. clcombo = QComboBox()
  27. layout.addWidget(clcombo)
  28. self.cslist = cslist.ChangesetList()
  29. layout.addWidget(self.cslist)
  30. self.cmd = cmdui.Runner(parent=self)
  31. self.cmd.commandFinished.connect(self.commandFinished)
  32. self.cmd.output.connect(self.output)
  33. self.cmd.makeLogVisible.connect(self.makeLogVisible)
  34. BB = QDialogButtonBox
  35. bb = QDialogButtonBox(BB.Ok|BB.Cancel|BB.Discard)
  36. bb.rejected.connect(self.reject)
  37. bb.button(BB.Discard).setText('Revert')
  38. bb.button(BB.Discard).setAutoDefault(False)
  39. bb.button(BB.Discard).clicked.connect(self.revert)
  40. bb.button(BB.Discard).setEnabled(False)
  41. bb.button(BB.Ok).setText('Submit')
  42. bb.button(BB.Ok).setAutoDefault(True)
  43. bb.button(BB.Ok).clicked.connect(self.submit)
  44. bb.button(BB.Ok).setEnabled(False)
  45. layout.addWidget(bb)
  46. self.bb = bb
  47. clcombo.activated[QString].connect(self.p4clActivated)
  48. for changelist in self.pending:
  49. clcombo.addItem(hglib.tounicode(changelist))
  50. self.p4clActivated(clcombo.currentText())
  51. self.setWindowTitle(_('Pending Perforce Changelists - %s') %
  52. repo.displayname)
  53. @pyqtSlot(QString)
  54. def p4clActivated(self, curcl):
  55. 'User has selected a changelist, fill cslist'
  56. curcl = hglib.fromunicode(curcl)
  57. try:
  58. hashes = self.pending[curcl]
  59. revs = [self.repo[hash] for hash in hashes]
  60. except error.Abort, e:
  61. revs = []
  62. self.cslist.clear()
  63. self.cslist.update(self.repo, revs)
  64. sensitive = not curcl.endswith('(submitted)')
  65. self.bb.button(QDialogButtonBox.Ok).setEnabled(sensitive)
  66. self.bb.button(QDialogButtonBox.Discard).setEnabled(sensitive)
  67. self.curcl = curcl
  68. def submit(self):
  69. assert(self.curcl.endswith('(pending)'))
  70. cmdline = ['p4submit', '--verbose',
  71. '--config', 'extensions.perfarce=',
  72. '--repository', self.url,
  73. self.curcl[:-10]]
  74. self.repo.incrementBusyCount()
  75. self.bb.button(QDialogButtonBox.Ok).setEnabled(False)
  76. self.bb.button(QDialogButtonBox.Discard).setEnabled(False)
  77. self.showMessage.emit(_('Submitting p4 changelist...'))
  78. self.cmd.run(cmdline, useproc=True)
  79. def revert(self):
  80. assert(self.curcl.endswith('(pending)'))
  81. cmdline = ['p4revert', '--verbose',
  82. '--config', 'extensions.perfarce=',
  83. '--repository', self.url,
  84. self.curcl[:-10]]
  85. self.repo.incrementBusyCount()
  86. self.bb.button(QDialogButtonBox.Ok).setEnabled(False)
  87. self.bb.button(QDialogButtonBox.Discard).setEnabled(False)
  88. self.showMessage.emit(_('Reverting p4 changelist...'))
  89. self.cmd.run(cmdline, useproc=True)
  90. def commandFinished(self, ret):
  91. self.showMessage.emit('')
  92. self.repo.decrementBusyCount()
  93. self.bb.button(QDialogButtonBox.Ok).setEnabled(True)
  94. self.bb.button(QDialogButtonBox.Discard).setEnabled(True)
  95. if ret == 0:
  96. self.reject()
  97. def keyPressEvent(self, event):
  98. if event.key() == Qt.Key_Escape:
  99. if self.cmd.isRunning():
  100. self.cmd.cancel()
  101. else:
  102. self.reject()
  103. else:
  104. return super(PerforcePending, self).keyPressEvent(event)