Changeset 38e56e40368a…
Parent 497104ef2695…
by
Changes to 2 files · Browse files at 38e56e40368a Showing diff from parent 497104ef2695 Diff from another changeset...
|
|
@@ -1,19 +1,16 @@ # postreview.py - post review dialog for TortoiseHg
#
-# Copyright 2010 Michael De Wildt <michael.dewildt@gmail.com>
+# Copyright 2011 Michael De Wildt <michael.dewildt@gmail.com>
#
# A dialog to allow users to post a review to reviewboard
# http:///www.reviewboard.org
#
-# This dialog requires a fork of the reviewboard mercurial plugin which can be
-# downloaded from:
+# This dialog requires a fork of the review board mercurial plugin, maintained
+# by mdelagra, that can be downloaded from:
#
-# http://bitbucket.org/michaeldewildt/mercurial-reviewboard
+# https://bitbucket.org/mdelagra/mercurial-reviewboard/
#
-# I hope to get my changes merged into the original extension blow, but
-# until then, the fork above must be used.
-#
-# http://mercurial.selenic.com/wiki/ReviewboardExtension
+# More information can be found at http://www.mikeyd.com.au/tortoisehg-reviewboard
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2, incorporated herein by reference.
@@ -33,76 +30,76 @@
def run(self):
msg = None
- reviewboard = extensions.find('reviewboard')
+ if not self.dialog.server:
+ msg = _("Invalid Settings - The ReviewBoard server is not setup")
+ elif not self.dialog.user:
+ msg = _("Invalid Settings - Please provide your ReviewBoard username")
+ else:
+ rb = extensions.find("reviewboard")
+ try:
+ pwd = self.dialog.password
+ #if we don't have a password send something here to skip
+ #the cli getpass in the extension. We will set the password
+ #later
+ if not pwd:
+ pwd = "None"
+
+ self.reviewboard = rb.make_rbclient(self.dialog.server,
+ self.dialog.user,
+ pwd)
+ self.loadCombos()
- server = self.dialog.server
- user = self.dialog.user
- password = self.dialog.password
-
- if server:
- if user and password:
- try:
- self._reviewboard = reviewboard.make_rbclient(server,
- user,
- password)
- self.load_combos()
-
- except reviewboard.ReviewBoardError, e:
- msg = e.msg
- else:
- msg = _("Invalid Settings - Please provide your ReviewBoard " +
- "username and password")
- else:
- msg = _("Invalid Settings - The ReviewBoard server is not setup")
+ except rb.ReviewBoardError, e:
+ msg = e.msg
self.dialog._error_message = msg
- def load_combos(self):
+ def loadCombos(self):
#Get the index of a users previously selected repo id
index = 0
count = 0
- self.dialog._qui.progress_label.setText("Loading repositories...")
- for r in self._reviewboard.repositories():
- if r.id == self.dialog._repo_id:
+ self.dialog.qui.progress_label.setText("Loading repositories...")
+ for r in self.reviewboard.repositories():
+ if r.id == self.dialog.repo_id:
index = count
- self.dialog._qui.repo_id_combo.addItem(str(r.id) + ": " + r.name)
+ self.dialog.qui.repo_id_combo.addItem(str(r.id) + ": " + r.name)
count += 1
- if self.dialog._qui.repo_id_combo.count():
- self.dialog._qui.repo_id_combo.setCurrentIndex(index)
+ if self.dialog.qui.repo_id_combo.count():
+ self.dialog.qui.repo_id_combo.setCurrentIndex(index)
- self.dialog._qui.progress_label.setText("Loading existing reviews...")
- for r in self._reviewboard.requests():
+ self.dialog.qui.progress_label.setText("Loading existing reviews...")
+ for r in self.reviewboard.pending_user_requests():
summary = str(r.id) + ": " + r.summary[0:100]
- self.dialog._qui.review_id_combo.addItem(summary)
+ self.dialog.qui.review_id_combo.addItem(summary)
- if self.dialog._qui.review_id_combo.count():
- self.dialog._qui.review_id_combo.setCurrentIndex(0)
+ if self.dialog.qui.review_id_combo.count():
+ self.dialog.qui.review_id_combo.setCurrentIndex(0)
class PostReviewDialog(QDialog):
"""Dialog for sending patches to reviewboard"""
def __init__(self, ui, repo, revs, parent=None):
super(PostReviewDialog, self).__init__(parent)
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
- self._ui = ui
- self._repo = repo
- self._error_message = None
+ self.ui = ui
+ self.repo = repo
+ self.error_message = None
- self._qui = Ui_PostReviewDialog()
- self._qui.setupUi(self)
+ self.qui = Ui_PostReviewDialog()
+ self.qui.setupUi(self)
- self._initchangesets(revs)
- self._readsettings()
+ self.initChangesets(revs)
+ self.readSettings()
- self._review_thread = LoadReviewDataThread(self)
- self._review_thread.finished.connect(self.error_prompt)
- self._review_thread.start()
+ self.review_thread = LoadReviewDataThread(self)
+ self.review_thread.finished.connect(self.errorPrompt)
+ self.review_thread.start()
def keyPressEvent(self, event):
- # don't post review by just hitting enter
+ # don't post review by just hitting enter
if event.key() in (Qt.Key_Return, Qt.Key_Enter):
- if event.modifiers() == Qt.ControlModifier and self._isvalid():
+ if event.modifiers() == Qt.ControlModifier and self.isValid():
self.accept() # Ctrl+Enter
return
@@ -110,60 +107,73 @@ super(PostReviewDialog, self).keyPressEvent(event)
@pyqtSlot()
- def error_prompt(self):
- self._qui.progress_bar.hide()
- self._qui.progress_label.hide()
+ def passwordPrompt(self):
+ pwd, ok = QInputDialog.getText(self,
+ _('Review Board'),
+ _('Password:'),
+ mode=QLineEdit.Password)
+ if ok and pwd:
+ self.password = pwd
+ return True
+ else:
+ self.password = None
+ return False
- if self._error_message:
+ @pyqtSlot()
+ def errorPrompt(self):
+ self.qui.progress_bar.hide()
+ self.qui.progress_label.hide()
+
+ if self.error_message:
qtlib.ErrorMsgBox(_('Review Board'),
- _('Error'), self._error_message)
+ _('Error'), self.error_message)
self.close()
- elif self._isvalid():
- self._qui.post_review_button.setEnabled(True)
+ elif self.isValid():
+ self.qui.post_review_button.setEnabled(True)
def closeEvent(self, event):
# Dispose of the review data thread
- self._review_thread.terminate()
- self._review_thread.wait()
+ self.review_thread.terminate()
+ self.review_thread.wait()
- self._writesettings()
+ self.writeSettings()
super(PostReviewDialog, self).closeEvent(event)
- def _readsettings(self):
+ def readSettings(self):
s = QSettings()
self.restoreGeometry(s.value('reviewboard/geom').toByteArray())
- self._qui.publish_immediately_check.setChecked(
+ self.qui.publish_immediately_check.setChecked(
s.value('reviewboard/publish_immediately_check').toBool())
- self._qui.longdiff_check.setChecked(
- s.value('reviewboard/longdiff_check').toBool())
-# self._qui.outgoing_check.setChecked(
-# s.value('reviewboard/outgoing_check').toBool())
- self._qui.update_fields.setChecked(
+ self.qui.outgoing_changes_check.setChecked(
+ s.value('reviewboard/outgoing_changes_check').toBool())
+ self.qui.branch_check.setChecked(
+ s.value('reviewboard/branch_check').toBool())
+ self.qui.update_fields.setChecked(
s.value('reviewboard/update_fields').toBool())
- self._qui.summary_edit.addItems(
+ self.qui.summary_edit.addItems(
s.value('reviewboard/summary_edit_history').toStringList())
- self._repo_id = s.value('reviewboard/repo_id').toInt()[0]
+ self.repo_id = s.value('reviewboard/repo_id').toInt()[0]
- self.server = self._repo.ui.config('reviewboard', 'server')
- self.user = self._repo.ui.config('reviewboard', 'user')
- self.password = self._repo.ui.config('reviewboard', 'password')
- self.browser = self._repo.ui.config('reviewboard', 'browser')
+ self.server = self.repo.ui.config('reviewboard', 'server')
+ self.user = self.repo.ui.config('reviewboard', 'user')
+ self.password = self.repo.ui.config('reviewboard', 'password')
+ self.browser = self.repo.ui.config('reviewboard', 'browser')
- def _writesettings(self):
+ def writeSettings(self):
s = QSettings()
s.setValue('reviewboard/geom', self.saveGeometry())
s.setValue('reviewboard/publish_immediately_check',
- self._qui.publish_immediately_check.isChecked())
-# s.setValue('reviewboard/outgoing_check',
-# self._qui.outgoing_check.isChecked())
- s.setValue('reviewboard/longdiff_check',
- self._qui.longdiff_check.isChecked())
+ self.qui.publish_immediately_check.isChecked())
+ s.setValue('reviewboard/branch_check',
+ self.qui.branch_check.isChecked())
+ s.setValue('reviewboard/outgoing_changes_check',
+ self.qui.outgoing_changes_check.isChecked())
s.setValue('reviewboard/update_fields',
- self._qui.update_fields.isChecked())
- s.setValue('reviewboard/repo_id', self._getrepoid())
+ self.qui.update_fields.isChecked())
+ s.setValue('reviewboard/repo_id', self.getRepoId())
def itercombo(w):
if w.currentText():
@@ -173,108 +183,130 @@ yield w.itemText(i)
s.setValue('reviewboard/summary_edit_history',
- list(itercombo(self._qui.summary_edit))[:10])
+ list(itercombo(self.qui.summary_edit))[:10])
- def _initchangesets(self, revs, selected_revs=None):
+ def initChangesets(self, revs, selected_revs=None):
def purerevs(revs):
- return cmdutil.revrange(self._repo,
+ return cmdutil.revrange(self.repo,
iter(str(e) for e in revs))
if selected_revs:
selectedrevs = purerevs(selected_revs)
else:
selectedrevs = purerevs(revs)
- self._changesets = _ChangesetsModel(self._repo,
+ self._changesets = _ChangesetsModel(self.repo,
# TODO: [':'] is inefficient
revs=purerevs(revs or [':']),
selectedrevs=selectedrevs,
parent=self)
- self._qui.changesets_view.setModel(self._changesets)
+ self.qui.changesets_view.setModel(self._changesets)
@property
- def _selectedrevs(self):
+ def selectedRevs(self):
"""Returns list of revisions to be sent"""
return self._changesets.selectedrevs
@property
- def _allrevs(self):
+ def allRevs(self):
"""Returns list of revisions to be sent"""
return self._changesets.revs
- def _getrepoid(self):
- comboText = self._qui.repo_id_combo.currentText().split(":")
+ def getRepoId(self):
+ comboText = self.qui.repo_id_combo.currentText().split(":")
return str(comboText[0])
- def _getreviewid(self):
- comboText = self._qui.review_id_combo.currentText().split(":")
+ def getReviewId(self):
+ comboText = self.qui.review_id_combo.currentText().split(":")
return str(comboText[0])
- def _getsummary(self):
- comboText = self._qui.review_id_combo.currentText().split(":")
+ def getSummary(self):
+ comboText = self.qui.review_id_combo.currentText().split(":")
return str(comboText[1])
- def _postreviewopts(self, **opts):
- """Generate opts for reviewboard by form values"""
- opts['longdiff'] = self._qui.longdiff_check.isChecked()
- opts['publish'] = self._qui.publish_immediately_check.isChecked()
+ def postReviewOpts(self, **opts):
+ """Generate opts for reviewboard by form values"""
+ opts['outgoingchanges'] = self.qui.outgoing_changes_check.isChecked()
+ opts['branch'] = self.qui.branch_check.isChecked()
+ opts['publish'] = self.qui.publish_immediately_check.isChecked()
- if self._qui.tab_widget.currentIndex() == 1:
- opts["existing"] = self._getreviewid()
- opts['update'] = self._qui.update_fields.isChecked()
- opts['summary'] = self._getsummary()
+ if self.qui.tab_widget.currentIndex() == 1:
+ opts["existing"] = self.getReviewId()
+ opts['update'] = self.qui.update_fields.isChecked()
+ opts['summary'] = self.getSummary()
else:
- opts['repoid'] = self._getrepoid()
- opts['summary'] = hglib.fromunicode(self._qui.summary_edit.currentText())
+ opts['repoid'] = self.getRepoId()
+ opts['summary'] = hglib.fromunicode(self.qui.summary_edit.currentText())
- if (len(self._selectedrevs) > 1):
+ if (len(self.selectedRevs) > 1):
#Set the parent to the revision below the last one on the list
#so all checked revisions are included in the request
- opts['parent'] = str(self._selectedrevs[0] - 1)
+ opts['parent'] = str(self.selectedRevs[0] - 1)
# Always use the upstream repo to determine the parent diff base
- # without the diff uploaded to review board dies
+ # without the diff uploaded to review board dies
opts['outgoing'] = True
+ #Set the password just in case the user has opted to not save it
+ opts['password'] = str(self.password)
+
#Finally we want to pass the repo path to the hg extension
- opts['repository'] = self._repo.root
+ opts['repository'] = self.repo.root
return opts
- def _isvalid(self):
+ def isValid(self):
"""Filled all required values?"""
- if not self._qui.repo_id_combo.currentText():
+ if not self.qui.repo_id_combo.currentText():
return False
- if self._qui.tab_widget.currentIndex() == 1:
- if not self._qui.review_id_combo.currentText():
+ if self.qui.tab_widget.currentIndex() == 1:
+ if not self.qui.review_id_combo.currentText():
return False
- if not self._allrevs:
+ if not self.allRevs:
return False
return True
@pyqtSlot()
- def tab_changed(self):
- self._qui.post_review_button.setEnabled(self._isvalid())
+ def tabChanged(self):
+ self.qui.post_review_button.setEnabled(self.isValid())
@pyqtSlot()
- def toggle_outgoing_changesets(self):
- if self._qui.changesets_view.isEnabled():
- self._initchangesets(self._allrevs, [self._selectedrevs.pop()])
- self._qui.changesets_view.setEnabled(False)
+ def branchCheckToggle(self):
+ if self.qui.branch_check.isChecked():
+ self.qui.outgoing_changes_check.setChecked(False)
+
+ self.toggleOutgoingChangesets()
+
+ @pyqtSlot()
+ def outgoingChangesCheckToggle(self):
+ if self.qui.outgoing_changes_check.isChecked():
+ self.qui.branch_check.setChecked(False)
+
+ self.toggleOutgoingChangesets()
+
+ def toggleOutgoingChangesets(self):
+ branch = self.qui.branch_check.isChecked()
+ outgoing = self.qui.outgoing_changes_check.isChecked()
+ if branch or outgoing:
+ self.initChangesets(self.allRevs, [self.selectedRevs.pop()])
+ self.qui.changesets_view.setEnabled(False)
else:
- self._initchangesets(self._allrevs, self._allrevs)
- self._qui.changesets_view.setEnabled(True)
+ self.initChangesets(self.allRevs, self.allRevs)
+ self.qui.changesets_view.setEnabled(True)
- def close(self):
+ def close(self):
super(PostReviewDialog, self).accept()
def accept(self):
- self._qui.progress_bar.show()
- self._qui.progress_label.setText("Posting Review...")
- self._qui.progress_label.show()
+ if not self.password and not self.passwordPrompt():
+ return
+
+ self.qui.progress_bar.show()
+ self.qui.progress_label.setText("Posting Review...")
+ self.qui.progress_label.show()
def cmdargs(opts):
args = []
@@ -288,26 +320,26 @@
return args
- hglib.loadextension(self._ui, 'reviewboard')
+ hglib.loadextension(self.ui, 'reviewboard')
- opts = self._postreviewopts()
+ opts = self.postReviewOpts()
- revstr = str(self._selectedrevs.pop())
+ revstr = str(self.selectedRevs.pop())
- self._qui.post_review_button.setEnabled(False)
- self._qui.close_button.setEnabled(False)
+ self.qui.post_review_button.setEnabled(False)
+ self.qui.close_button.setEnabled(False)
- self._cmd = cmdui.Dialog(['postreview'] + cmdargs(opts) + [revstr],
- self, self.on_completion)
- self._cmd.setWindowTitle(_('Posting Review'))
- self._cmd.show_output(False)
+ self.cmd = cmdui.Dialog(['postreview'] + cmdargs(opts) + [revstr],
+ self, self.onCompletion)
+ self.cmd.setWindowTitle(_('Posting Review'))
+ self.cmd.show_output(False)
@pyqtSlot()
- def on_completion(self):
- self._qui.progress_bar.hide()
- self._qui.progress_label.hide()
+ def onCompletion(self):
+ self.qui.progress_bar.hide()
+ self.qui.progress_label.hide()
- output = self._cmd.core.get_rawoutput()
+ output = self.cmd.core.get_rawoutput()
saved = 'saved:' in output
published = 'published:' in output
@@ -325,14 +357,22 @@ msg, parent=self)
else:
error = output.split('abort: ').pop().strip()
- qtlib.ErrorMsgBox(_('Review Board'),
- _('Error'), error)
+ if error[:29] == "HTTP Error: basic auth failed":
+ if self.passwordPrompt():
+ self.accept()
+ else:
+ self.qui.post_review_button.setEnabled(True)
+ self.qui.close_button.setEnabled(True)
+ return
+ else:
+ qtlib.ErrorMsgBox(_('Review Board'),
+ _('Error'), error)
- self._writesettings()
+ self.writeSettings()
super(PostReviewDialog, self).accept()
@pyqtSlot()
- def on_settings_button_clicked(self):
+ def onSettingsButtonClicked(self):
from tortoisehg.hgqt import settings
settings.SettingsDialog(parent=self, focus='reviewboard.server').exec_()
|
@@ -135,9 +135,16 @@ </property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
- <widget class="QCheckBox" name="longdiff_check">
+ <widget class="QCheckBox" name="outgoing_changes_check">
<property name="text">
- <string>Create diff with all changes since last upstream sync</string>
+ <string>Create diff with all outgoing changes</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="branch_check">
+ <property name="text">
+ <string>Create diff with all changes on this branch</string>
</property>
</widget>
</item>
@@ -347,10 +354,26 @@ </hints>
</connection>
<connection>
- <sender>longdiff_check</sender>
+ <sender>outgoing_changes_check</sender>
<signal>toggled(bool)</signal>
<receiver>PostReviewDialog</receiver>
- <slot>toggle_outgoing_changesets()</slot>
+ <slot>outgoingChangesCheckToggle()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>20</x>
+ <y>20</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>branch_check</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PostReviewDialog</receiver>
+ <slot>branchCheckToggle()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
@@ -366,7 +389,7 @@ <sender>tab_widget</sender>
<signal>currentChanged(int)</signal>
<receiver>PostReviewDialog</receiver>
- <slot>tab_changed()</slot>
+ <slot>tabChanged()</slot>
<hints>
<hint type="sourcelabel">
<x>20</x>
|
Loading...