/tortoisehg/hgqt/p4pending.py
https://bitbucket.org/tortoisehg/hgtk/ · Python · 124 lines · 98 code · 20 blank · 6 comment · 9 complexity · 30b6518fae58b28a7d98186d24bb2277 MD5 · raw file
- # p4pending.py - Display pending p4 changelists, created by perfarce extension
- #
- # Copyright 2010 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
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- from mercurial import error
- from tortoisehg.util import hglib
- from tortoisehg.hgqt.i18n import _
- from tortoisehg.hgqt import qtlib, cslist, cmdui
- class PerforcePending(QDialog):
- 'Dialog for selecting a revision'
- output = pyqtSignal(QString, QString)
- makeLogVisible = pyqtSignal(bool)
- showMessage = pyqtSignal(unicode)
- def __init__(self, repo, pending, url, parent):
- QDialog.__init__(self, parent)
- self.repo = repo
- self.url = url
- self.pending = pending # dict of changelist -> hash tuple
- layout = QVBoxLayout()
- self.setLayout(layout)
- clcombo = QComboBox()
- layout.addWidget(clcombo)
- self.cslist = cslist.ChangesetList()
- layout.addWidget(self.cslist)
- self.cmd = cmdui.Runner(parent=self)
- self.cmd.commandFinished.connect(self.commandFinished)
- self.cmd.output.connect(self.output)
- self.cmd.makeLogVisible.connect(self.makeLogVisible)
- BB = QDialogButtonBox
- bb = QDialogButtonBox(BB.Ok|BB.Cancel|BB.Discard)
- bb.rejected.connect(self.reject)
- bb.button(BB.Discard).setText('Revert')
- bb.button(BB.Discard).setAutoDefault(False)
- bb.button(BB.Discard).clicked.connect(self.revert)
- bb.button(BB.Discard).setEnabled(False)
- bb.button(BB.Ok).setText('Submit')
- bb.button(BB.Ok).setAutoDefault(True)
- bb.button(BB.Ok).clicked.connect(self.submit)
- bb.button(BB.Ok).setEnabled(False)
- layout.addWidget(bb)
- self.bb = bb
- clcombo.activated[QString].connect(self.p4clActivated)
- for changelist in self.pending:
- clcombo.addItem(hglib.tounicode(changelist))
- self.p4clActivated(clcombo.currentText())
- self.setWindowTitle(_('Pending Perforce Changelists - %s') %
- repo.displayname)
- @pyqtSlot(QString)
- def p4clActivated(self, curcl):
- 'User has selected a changelist, fill cslist'
- curcl = hglib.fromunicode(curcl)
- try:
- hashes = self.pending[curcl]
- revs = [self.repo[hash] for hash in hashes]
- except error.Abort, e:
- revs = []
- self.cslist.clear()
- self.cslist.update(self.repo, revs)
- sensitive = not curcl.endswith('(submitted)')
- self.bb.button(QDialogButtonBox.Ok).setEnabled(sensitive)
- self.bb.button(QDialogButtonBox.Discard).setEnabled(sensitive)
- self.curcl = curcl
- def submit(self):
- assert(self.curcl.endswith('(pending)'))
- cmdline = ['p4submit', '--verbose',
- '--config', 'extensions.perfarce=',
- '--repository', self.url,
- self.curcl[:-10]]
- self.repo.incrementBusyCount()
- self.bb.button(QDialogButtonBox.Ok).setEnabled(False)
- self.bb.button(QDialogButtonBox.Discard).setEnabled(False)
- self.showMessage.emit(_('Submitting p4 changelist...'))
- self.cmd.run(cmdline, useproc=True)
- def revert(self):
- assert(self.curcl.endswith('(pending)'))
- cmdline = ['p4revert', '--verbose',
- '--config', 'extensions.perfarce=',
- '--repository', self.url,
- self.curcl[:-10]]
- self.repo.incrementBusyCount()
- self.bb.button(QDialogButtonBox.Ok).setEnabled(False)
- self.bb.button(QDialogButtonBox.Discard).setEnabled(False)
- self.showMessage.emit(_('Reverting p4 changelist...'))
- self.cmd.run(cmdline, useproc=True)
- def commandFinished(self, ret):
- self.showMessage.emit('')
- self.repo.decrementBusyCount()
- self.bb.button(QDialogButtonBox.Ok).setEnabled(True)
- self.bb.button(QDialogButtonBox.Discard).setEnabled(True)
- if ret == 0:
- self.reject()
- def keyPressEvent(self, event):
- if event.key() == Qt.Key_Escape:
- if self.cmd.isRunning():
- self.cmd.cancel()
- else:
- self.reject()
- else:
- return super(PerforcePending, self).keyPressEvent(event)