--- a/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusDialog.py Wed Jul 13 11:16:20 2022 +0200 +++ b/src/eric7/Plugins/VcsPlugins/vcsSubversion/SvnStatusDialog.py Wed Jul 13 14:55:47 2022 +0200 @@ -13,8 +13,13 @@ from PyQt6.QtCore import pyqtSlot, Qt, QTimer, QProcess from PyQt6.QtWidgets import ( - QWidget, QHeaderView, QLineEdit, QApplication, QMenu, QDialogButtonBox, - QTreeWidgetItem + QWidget, + QHeaderView, + QLineEdit, + QApplication, + QMenu, + QDialogButtonBox, + QTreeWidgetItem, ) from EricWidgets.EricApplication import ericApp @@ -31,16 +36,17 @@ Class implementing a dialog to show the output of the svn status command process. """ + def __init__(self, vcs, parent=None): """ Constructor - + @param vcs reference to the vcs object @param parent parent widget (QWidget) """ super().__init__(parent) self.setupUi(self) - + self.__toBeCommittedColumn = 0 self.__changelistColumn = 1 self.__statusColumn = 2 @@ -52,185 +58,215 @@ self.__upToDateColumn = 8 self.__pathColumn = 12 self.__lastColumn = self.statusList.columnCount() - + self.refreshButton = self.buttonBox.addButton( - self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole) - self.refreshButton.setToolTip( - self.tr("Press to refresh the status display")) + self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole + ) + self.refreshButton.setToolTip(self.tr("Press to refresh the status display")) self.refreshButton.setEnabled(False) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setEnabled(False) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Cancel).setDefault(True) - + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False) + self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True) + self.diff = None self.vcs = vcs self.vcs.committed.connect(self.__committed) - + self.process = QProcess() self.process.finished.connect(self.__procFinished) self.process.readyReadStandardOutput.connect(self.__readStdout) self.process.readyReadStandardError.connect(self.__readStderr) - + self.statusList.headerItem().setText(self.__lastColumn, "") - self.statusList.header().setSortIndicator(self.__pathColumn, - Qt.SortOrder.AscendingOrder) + self.statusList.header().setSortIndicator( + self.__pathColumn, Qt.SortOrder.AscendingOrder + ) if self.vcs.version < (1, 5, 0): self.statusList.header().hideSection(self.__changelistColumn) - + self.menuactions = [] self.menu = QMenu() - self.menuactions.append(self.menu.addAction( - self.tr("Commit changes to repository..."), self.__commit)) - self.menuactions.append(self.menu.addAction( - self.tr("Select all for commit"), self.__commitSelectAll)) - self.menuactions.append(self.menu.addAction( - self.tr("Deselect all from commit"), self.__commitDeselectAll)) + self.menuactions.append( + self.menu.addAction( + self.tr("Commit changes to repository..."), self.__commit + ) + ) + self.menuactions.append( + self.menu.addAction( + self.tr("Select all for commit"), self.__commitSelectAll + ) + ) + self.menuactions.append( + self.menu.addAction( + self.tr("Deselect all from commit"), self.__commitDeselectAll + ) + ) self.menu.addSeparator() - self.menuactions.append(self.menu.addAction( - self.tr("Add to repository"), self.__add)) - self.menuactions.append(self.menu.addAction( - self.tr("Show differences"), self.__diff)) - self.menuactions.append(self.menu.addAction( - self.tr("Show differences side-by-side"), self.__sbsDiff)) - self.menuactions.append(self.menu.addAction( - self.tr("Revert changes"), self.__revert)) - self.menuactions.append(self.menu.addAction( - self.tr("Restore missing"), self.__restoreMissing)) + self.menuactions.append( + self.menu.addAction(self.tr("Add to repository"), self.__add) + ) + self.menuactions.append( + self.menu.addAction(self.tr("Show differences"), self.__diff) + ) + self.menuactions.append( + self.menu.addAction( + self.tr("Show differences side-by-side"), self.__sbsDiff + ) + ) + self.menuactions.append( + self.menu.addAction(self.tr("Revert changes"), self.__revert) + ) + self.menuactions.append( + self.menu.addAction(self.tr("Restore missing"), self.__restoreMissing) + ) if self.vcs.version >= (1, 5, 0): self.menu.addSeparator() - self.menuactions.append(self.menu.addAction( - self.tr("Add to Changelist"), self.__addToChangelist)) - self.menuactions.append(self.menu.addAction( - self.tr("Remove from Changelist"), - self.__removeFromChangelist)) + self.menuactions.append( + self.menu.addAction( + self.tr("Add to Changelist"), self.__addToChangelist + ) + ) + self.menuactions.append( + self.menu.addAction( + self.tr("Remove from Changelist"), self.__removeFromChangelist + ) + ) if self.vcs.version >= (1, 2, 0): self.menu.addSeparator() - self.menuactions.append(self.menu.addAction( - self.tr("Lock"), self.__lock)) - self.menuactions.append(self.menu.addAction( - self.tr("Unlock"), self.__unlock)) - self.menuactions.append(self.menu.addAction( - self.tr("Break lock"), - self.__breakLock)) - self.menuactions.append(self.menu.addAction( - self.tr("Steal lock"), - self.__stealLock)) + self.menuactions.append(self.menu.addAction(self.tr("Lock"), self.__lock)) + self.menuactions.append( + self.menu.addAction(self.tr("Unlock"), self.__unlock) + ) + self.menuactions.append( + self.menu.addAction(self.tr("Break lock"), self.__breakLock) + ) + self.menuactions.append( + self.menu.addAction(self.tr("Steal lock"), self.__stealLock) + ) self.menu.addSeparator() - self.menuactions.append(self.menu.addAction( - self.tr("Adjust column sizes"), - self.__resizeColumns)) + self.menuactions.append( + self.menu.addAction(self.tr("Adjust column sizes"), self.__resizeColumns) + ) for act in self.menuactions: act.setEnabled(False) - - self.statusList.setContextMenuPolicy( - Qt.ContextMenuPolicy.CustomContextMenu) - self.statusList.customContextMenuRequested.connect( - self.__showContextMenu) - + + self.statusList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) + self.statusList.customContextMenuRequested.connect(self.__showContextMenu) + self.modifiedIndicators = [ - self.tr('added'), - self.tr('deleted'), - self.tr('modified'), + self.tr("added"), + self.tr("deleted"), + self.tr("modified"), ] - + self.missingIndicators = [ - self.tr('missing'), + self.tr("missing"), ] - + self.unversionedIndicators = [ - self.tr('unversioned'), + self.tr("unversioned"), ] - + self.lockedIndicators = [ - self.tr('locked'), + self.tr("locked"), ] - + self.stealBreakLockIndicators = [ - self.tr('other lock'), - self.tr('stolen lock'), - self.tr('broken lock'), + self.tr("other lock"), + self.tr("stolen lock"), + self.tr("broken lock"), ] - + self.unlockedIndicators = [ - self.tr('not locked'), + self.tr("not locked"), ] - + self.status = { - ' ': self.tr('normal'), - 'A': self.tr('added'), - 'C': self.tr('conflict'), - 'D': self.tr('deleted'), - 'I': self.tr('ignored'), - 'M': self.tr('modified'), - 'R': self.tr('replaced'), - 'X': self.tr('external'), - '?': self.tr('unversioned'), - '!': self.tr('missing'), - '~': self.tr('type error'), + " ": self.tr("normal"), + "A": self.tr("added"), + "C": self.tr("conflict"), + "D": self.tr("deleted"), + "I": self.tr("ignored"), + "M": self.tr("modified"), + "R": self.tr("replaced"), + "X": self.tr("external"), + "?": self.tr("unversioned"), + "!": self.tr("missing"), + "~": self.tr("type error"), } self.propStatus = { - ' ': self.tr('normal'), - 'M': self.tr('modified'), - 'C': self.tr('conflict'), + " ": self.tr("normal"), + "M": self.tr("modified"), + "C": self.tr("conflict"), } self.locked = { - ' ': self.tr('no'), - 'L': self.tr('yes'), + " ": self.tr("no"), + "L": self.tr("yes"), } self.history = { - ' ': self.tr('no'), - '+': self.tr('yes'), + " ": self.tr("no"), + "+": self.tr("yes"), } self.switched = { - ' ': self.tr('no'), - 'S': self.tr('yes'), - 'X': self.tr('external') + " ": self.tr("no"), + "S": self.tr("yes"), + "X": self.tr("external"), } self.lockinfo = { - ' ': self.tr('not locked'), - 'K': self.tr('locked'), - 'O': self.tr('other lock'), - 'T': self.tr('stolen lock'), - 'B': self.tr('broken lock'), + " ": self.tr("not locked"), + "K": self.tr("locked"), + "O": self.tr("other lock"), + "T": self.tr("stolen lock"), + "B": self.tr("broken lock"), } self.uptodate = { - ' ': self.tr('yes'), - '*': self.tr('no'), + " ": self.tr("yes"), + "*": self.tr("no"), } - + self.rx_status = re.compile( - '(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*') + "(.{8,9})\\s+([0-9-]+)\\s+([0-9?]+)\\s+(\\S+)\\s+(.+)\\s*" + ) # flags (8 or 9 anything), revision, changed rev, author, path - self.rx_status2 = re.compile('(.{8,9})\\s+(.+)\\s*') + self.rx_status2 = re.compile("(.{8,9})\\s+(.+)\\s*") # flags (8 or 9 anything), path - self.rx_changelist = re.compile('--- \\S+ .([\\w\\s]+).:\\s+') + self.rx_changelist = re.compile("--- \\S+ .([\\w\\s]+).:\\s+") # three dashes, Changelist (translated), quote, # changelist name, quote, : - + self.__nonverbose = True - + def __resort(self): """ Private method to resort the tree. """ self.statusList.sortItems( - self.statusList.sortColumn(), - self.statusList.header().sortIndicatorOrder()) - + self.statusList.sortColumn(), self.statusList.header().sortIndicatorOrder() + ) + def __resizeColumns(self): """ Private method to resize the list columns. """ - self.statusList.header().resizeSections( - QHeaderView.ResizeMode.ResizeToContents) + self.statusList.header().resizeSections(QHeaderView.ResizeMode.ResizeToContents) self.statusList.header().setStretchLastSection(True) - - def __generateItem(self, status, propStatus, locked, history, switched, - lockinfo, uptodate, revision, change, author, path): + + def __generateItem( + self, + status, + propStatus, + locked, + history, + switched, + lockinfo, + uptodate, + revision, + change, + author, + path, + ): """ Private method to generate a status item in the status list. - + @param status status indicator (string) @param propStatus property status indicator (string) @param locked locked indicator (string) @@ -244,18 +280,18 @@ @param path path of the file or directory (string) """ if ( - self.__nonverbose and - status == " " and - propStatus == " " and - locked == " " and - history == " " and - switched == " " and - lockinfo == " " and - uptodate == " " and - self.currentChangelist == "" + self.__nonverbose + and status == " " + and propStatus == " " + and locked == " " + and history == " " + and switched == " " + and lockinfo == " " + and uptodate == " " + and self.currentChangelist == "" ): return - + if revision == "": rev = "" else: @@ -271,13 +307,12 @@ except ValueError: chg = change statusText = self.status[status] - + itm = QTreeWidgetItem(self.statusList) itm.setData(0, Qt.ItemDataRole.DisplayRole, "") itm.setData(1, Qt.ItemDataRole.DisplayRole, self.currentChangelist) itm.setData(2, Qt.ItemDataRole.DisplayRole, statusText) - itm.setData(3, Qt.ItemDataRole.DisplayRole, - self.propStatus[propStatus]) + itm.setData(3, Qt.ItemDataRole.DisplayRole, self.propStatus[propStatus]) itm.setData(4, Qt.ItemDataRole.DisplayRole, self.locked[locked]) itm.setData(5, Qt.ItemDataRole.DisplayRole, self.history[history]) itm.setData(6, Qt.ItemDataRole.DisplayRole, self.switched[switched]) @@ -287,7 +322,7 @@ itm.setData(10, Qt.ItemDataRole.DisplayRole, chg) itm.setData(11, Qt.ItemDataRole.DisplayRole, author) itm.setData(12, Qt.ItemDataRole.DisplayRole, path) - + itm.setTextAlignment(1, Qt.AlignmentFlag.AlignLeft) itm.setTextAlignment(2, Qt.AlignmentFlag.AlignHCenter) itm.setTextAlignment(3, Qt.AlignmentFlag.AlignHCenter) @@ -300,97 +335,93 @@ itm.setTextAlignment(10, Qt.AlignmentFlag.AlignRight) itm.setTextAlignment(11, Qt.AlignmentFlag.AlignLeft) itm.setTextAlignment(12, Qt.AlignmentFlag.AlignLeft) - + if status in "ADM" or propStatus in "M": itm.setFlags(itm.flags() | Qt.ItemFlag.ItemIsUserCheckable) - itm.setCheckState(self.__toBeCommittedColumn, - Qt.CheckState.Checked) + itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked) else: itm.setFlags(itm.flags() & ~Qt.ItemFlag.ItemIsUserCheckable) - + self.hidePropertyStatusColumn = ( - self.hidePropertyStatusColumn and - propStatus == " " + self.hidePropertyStatusColumn and propStatus == " " ) self.hideLockColumns = ( - self.hideLockColumns and - locked == " " and - lockinfo == " " + self.hideLockColumns and locked == " " and lockinfo == " " ) self.hideUpToDateColumn = self.hideUpToDateColumn and uptodate == " " self.hideHistoryColumn = self.hideHistoryColumn and history == " " self.hideSwitchedColumn = self.hideSwitchedColumn and switched == " " - + if statusText not in self.__statusFilters: self.__statusFilters.append(statusText) - + def closeEvent(self, e): """ Protected slot implementing a close event handler. - + @param e close event (QCloseEvent) """ if ( - self.process is not None and - self.process.state() != QProcess.ProcessState.NotRunning + self.process is not None + and self.process.state() != QProcess.ProcessState.NotRunning ): self.process.terminate() QTimer.singleShot(2000, self.process.kill) self.process.waitForFinished(3000) - + e.accept() - + def start(self, fn): """ Public slot to start the svn status command. - + @param fn filename(s)/directoryname(s) to show the status of (string or list of strings) """ self.errorGroup.hide() self.intercept = False self.args = fn - + for act in self.menuactions: act.setEnabled(False) - + self.addButton.setEnabled(False) self.commitButton.setEnabled(False) self.diffButton.setEnabled(False) self.sbsDiffButton.setEnabled(False) self.revertButton.setEnabled(False) self.restoreButton.setEnabled(False) - + self.statusFilterCombo.clear() self.__statusFilters = [] self.statusList.clear() - + self.currentChangelist = "" self.changelistFound = False - + self.hidePropertyStatusColumn = True self.hideLockColumns = True self.hideUpToDateColumn = True self.hideHistoryColumn = True self.hideSwitchedColumn = True - + self.process.kill() - + args = [] - args.append('status') - self.vcs.addArguments(args, self.vcs.options['global']) - self.vcs.addArguments(args, self.vcs.options['status']) + args.append("status") + self.vcs.addArguments(args, self.vcs.options["global"]) + self.vcs.addArguments(args, self.vcs.options["status"]) if ( - '--verbose' not in self.vcs.options['global'] and - '--verbose' not in self.vcs.options['status'] + "--verbose" not in self.vcs.options["global"] + and "--verbose" not in self.vcs.options["status"] ): - args.append('--verbose') + args.append("--verbose") self.__nonverbose = True else: self.__nonverbose = False if ( - '--show-updates' in self.vcs.options['status'] or - '-u' in self.vcs.options['status'] + "--show-updates" in self.vcs.options["status"] + or "-u" in self.vcs.options["status"] ): self.activateWindow() self.raise_() @@ -400,134 +431,130 @@ else: self.dname, fname = self.vcs.splitPath(fn) args.append(fname) - + self.process.setWorkingDirectory(self.dname) - - self.setWindowTitle(self.tr('Subversion Status')) - - self.process.start('svn', args) + + self.setWindowTitle(self.tr("Subversion Status")) + + self.process.start("svn", args) procStarted = self.process.waitForStarted(5000) if not procStarted: self.inputGroup.setEnabled(False) self.inputGroup.hide() EricMessageBox.critical( self, - self.tr('Process Generation Error'), + self.tr("Process Generation Error"), self.tr( - 'The process {0} could not be started. ' - 'Ensure, that it is in the search path.' - ).format('svn')) + "The process {0} could not be started. " + "Ensure, that it is in the search path." + ).format("svn"), + ) else: - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setEnabled(False) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Cancel).setEnabled(True) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Cancel).setDefault(True) - + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled( + False + ) + self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled( + True + ) + self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault( + True + ) + self.inputGroup.setEnabled(True) self.inputGroup.show() self.refreshButton.setEnabled(False) - + def __finish(self): """ Private slot called when the process finished or the user pressed the button. """ if ( - self.process is not None and - self.process.state() != QProcess.ProcessState.NotRunning + self.process is not None + and self.process.state() != QProcess.ProcessState.NotRunning ): self.process.terminate() QTimer.singleShot(2000, self.process.kill) self.process.waitForFinished(3000) - - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setEnabled(True) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Cancel).setEnabled(False) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setDefault(True) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setFocus( - Qt.FocusReason.OtherFocusReason) - + + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False) + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True) + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus( + Qt.FocusReason.OtherFocusReason + ) + self.inputGroup.setEnabled(False) self.inputGroup.hide() self.refreshButton.setEnabled(True) - + self.__statusFilters.sort() self.__statusFilters.insert(0, "<{0}>".format(self.tr("all"))) self.statusFilterCombo.addItems(self.__statusFilters) - + for act in self.menuactions: act.setEnabled(True) - + self.__resort() self.__resizeColumns() - - self.statusList.setColumnHidden(self.__changelistColumn, - not self.changelistFound) - self.statusList.setColumnHidden(self.__propStatusColumn, - self.hidePropertyStatusColumn) - self.statusList.setColumnHidden(self.__lockedColumn, - self.hideLockColumns) - self.statusList.setColumnHidden(self.__lockinfoColumn, - self.hideLockColumns) - self.statusList.setColumnHidden(self.__upToDateColumn, - self.hideUpToDateColumn) - self.statusList.setColumnHidden(self.__historyColumn, - self.hideHistoryColumn) - self.statusList.setColumnHidden(self.__switchedColumn, - self.hideSwitchedColumn) - + + self.statusList.setColumnHidden( + self.__changelistColumn, not self.changelistFound + ) + self.statusList.setColumnHidden( + self.__propStatusColumn, self.hidePropertyStatusColumn + ) + self.statusList.setColumnHidden(self.__lockedColumn, self.hideLockColumns) + self.statusList.setColumnHidden(self.__lockinfoColumn, self.hideLockColumns) + self.statusList.setColumnHidden(self.__upToDateColumn, self.hideUpToDateColumn) + self.statusList.setColumnHidden(self.__historyColumn, self.hideHistoryColumn) + self.statusList.setColumnHidden(self.__switchedColumn, self.hideSwitchedColumn) + self.__updateButtons() self.__updateCommitButton() - + def on_buttonBox_clicked(self, button): """ Private slot called by a button of the button box clicked. - + @param button button that was clicked (QAbstractButton) """ - if button == self.buttonBox.button( - QDialogButtonBox.StandardButton.Close - ): + if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close): self.close() - elif button == self.buttonBox.button( - QDialogButtonBox.StandardButton.Cancel - ): + elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel): self.__finish() elif button == self.refreshButton: self.on_refreshButton_clicked() - + def __procFinished(self, exitCode, exitStatus): """ Private slot connected to the finished signal. - + @param exitCode exit code of the process (integer) @param exitStatus exit status of the process (QProcess.ExitStatus) """ self.__finish() - + def __readStdout(self): """ Private slot to handle the readyReadStandardOutput signal. - + It reads the output of the process, formats it and inserts it into the contents pane. """ if self.process is not None: self.process.setReadChannel(QProcess.ProcessChannel.StandardOutput) - + while self.process.canReadLine(): - s = str(self.process.readLine(), - Preferences.getSystem("IOEncoding"), - 'replace') + s = str( + self.process.readLine(), + Preferences.getSystem("IOEncoding"), + "replace", + ) match = ( - self.rx_status.fullmatch(s) or - self.rx_status2.fullmatch(s) or - self.rx_changelist.fullmatch(s) + self.rx_status.fullmatch(s) + or self.rx_status2.fullmatch(s) + or self.rx_changelist.fullmatch(s) ) if match.re is self.rx_status: flags = match.group(1) @@ -535,48 +562,70 @@ change = match.group(3) author = match.group(4) path = match.group(5).strip() - - self.__generateItem(flags[0], flags[1], flags[2], flags[3], - flags[4], flags[5], flags[-1], rev, - change, author, path) + + self.__generateItem( + flags[0], + flags[1], + flags[2], + flags[3], + flags[4], + flags[5], + flags[-1], + rev, + change, + author, + path, + ) elif match.re is self.rx_status2: flags = match.group(1) path = match.group(2).strip() - + if flags[-1] in self.uptodate: - self.__generateItem(flags[0], flags[1], flags[2], - flags[3], flags[4], flags[5], - flags[-1], "", "", "", path) + self.__generateItem( + flags[0], + flags[1], + flags[2], + flags[3], + flags[4], + flags[5], + flags[-1], + "", + "", + "", + path, + ) elif match.re is self.rx_changelist: self.currentChangelist = match.group(1) self.changelistFound = True - + def __readStderr(self): """ Private slot to handle the readyReadStandardError signal. - + It reads the error output of the process and inserts it into the error pane. """ if self.process is not None: self.errorGroup.show() - s = str(self.process.readAllStandardError(), - Preferences.getSystem("IOEncoding"), - 'replace') + s = str( + self.process.readAllStandardError(), + Preferences.getSystem("IOEncoding"), + "replace", + ) self.errors.insertPlainText(s) self.errors.ensureCursorVisible() - + def on_passwordCheckBox_toggled(self, isOn): """ Private slot to handle the password checkbox toggled. - + @param isOn flag indicating the status of the check box (boolean) """ if isOn: self.input.setEchoMode(QLineEdit.EchoMode.Password) else: self.input.setEchoMode(QLineEdit.EchoMode.Normal) - + @pyqtSlot() def on_sendButton_clicked(self): """ @@ -584,30 +633,30 @@ """ inputTxt = self.input.text() inputTxt += os.linesep - + if self.passwordCheckBox.isChecked(): self.errors.insertPlainText(os.linesep) self.errors.ensureCursorVisible() else: self.errors.insertPlainText(inputTxt) self.errors.ensureCursorVisible() - + self.process.write(strToQByteArray(inputTxt)) - + self.passwordCheckBox.setChecked(False) self.input.clear() - + def on_input_returnPressed(self): """ Private slot to handle the press of the return key in the input field. """ self.intercept = True self.on_sendButton_clicked() - + def keyPressEvent(self, evt): """ Protected slot to handle a key press event. - + @param evt the key press event (QKeyEvent) """ if self.intercept: @@ -615,14 +664,14 @@ evt.accept() return super().keyPressEvent(evt) - + @pyqtSlot() def on_refreshButton_clicked(self): """ Private slot to refresh the status display. """ self.start(self.args) - + def __updateButtons(self): """ Private method to update the VCS buttons status. @@ -636,19 +685,19 @@ self.sbsDiffButton.setEnabled(modified == 1) self.revertButton.setEnabled(modified) self.restoreButton.setEnabled(missing) - + def __updateCommitButton(self): """ Private method to update the Commit button status. """ commitable = len(self.__getCommitableItems()) self.commitButton.setEnabled(commitable) - + @pyqtSlot(int) def on_statusFilterCombo_activated(self, index): """ Private slot to react to the selection of a status filter. - + @param index index of the selected entry @type int """ @@ -661,99 +710,101 @@ for topIndex in range(self.statusList.topLevelItemCount()): topItem = self.statusList.topLevelItem(topIndex) topItem.setHidden(topItem.text(self.__statusColumn) != txt) - + @pyqtSlot(QTreeWidgetItem, int) def on_statusList_itemChanged(self, item, column): """ Private slot to act upon item changes. - + @param item reference to the changed item (QTreeWidgetItem) @param column index of column that changed (integer) """ if column == self.__toBeCommittedColumn: self.__updateCommitButton() - + @pyqtSlot() def on_statusList_itemSelectionChanged(self): """ Private slot to act upon changes of selected items. """ self.__updateButtons() - + @pyqtSlot() def on_commitButton_clicked(self): """ Private slot to handle the press of the Commit button. """ self.__commit() - + @pyqtSlot() def on_addButton_clicked(self): """ Private slot to handle the press of the Add button. """ self.__add() - + @pyqtSlot() def on_diffButton_clicked(self): """ Private slot to handle the press of the Differences button. """ self.__diff() - + @pyqtSlot() def on_sbsDiffButton_clicked(self): """ Private slot to handle the press of the Side-by-Side Diff button. """ self.__sbsDiff() - + @pyqtSlot() def on_revertButton_clicked(self): """ Private slot to handle the press of the Revert button. """ self.__revert() - + @pyqtSlot() def on_restoreButton_clicked(self): """ Private slot to handle the press of the Restore button. """ self.__restoreMissing() - + ########################################################################### ## Context menu handling methods ########################################################################### - + def __showContextMenu(self, coord): """ Private slot to show the context menu of the status list. - + @param coord the position of the mouse pointer (QPoint) """ self.menu.popup(self.statusList.mapToGlobal(coord)) - + def __commit(self): """ Private slot to handle the Commit context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getCommitableItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getCommitableItems() + ] if not names: EricMessageBox.information( self, self.tr("Commit"), - self.tr("""There are no entries selected to be""" - """ committed.""")) + self.tr("""There are no entries selected to be""" """ committed."""), + ) return - + if Preferences.getVCS("AutoSaveFiles"): vm = ericApp().getObject("ViewManager") for name in names: vm.saveEditor(name) - self.vcs.vcsCommit(names, '') - + self.vcs.vcsCommit(names, "") + def __committed(self): """ Private slot called after the commit has finished. @@ -761,176 +812,203 @@ if self.isVisible(): self.on_refreshButton_clicked() self.vcs.checkVCSStatus() - + def __commitSelectAll(self): """ Private slot to select all entries for commit. """ self.__commitSelect(True) - + def __commitDeselectAll(self): """ Private slot to deselect all entries from commit. """ self.__commitSelect(False) - + def __add(self): """ Private slot to handle the Add context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getUnversionedItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getUnversionedItems() + ] if not names: EricMessageBox.information( self, self.tr("Add"), - self.tr("""There are no unversioned entries""" - """ available/selected.""")) + self.tr( + """There are no unversioned entries""" """ available/selected.""" + ), + ) return - + self.vcs.vcsAdd(names) self.on_refreshButton_clicked() - + project = ericApp().getObject("Project") for name in names: project.getModel().updateVCSStatus(name) self.vcs.checkVCSStatus() - + def __revert(self): """ Private slot to handle the Revert context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getModifiedItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getModifiedItems() + ] if not names: EricMessageBox.information( self, self.tr("Revert"), - self.tr("""There are no uncommitted changes""" - """ available/selected.""")) + self.tr( + """There are no uncommitted changes""" """ available/selected.""" + ), + ) return - + self.vcs.vcsRevert(names) self.raise_() self.activateWindow() self.on_refreshButton_clicked() - + project = ericApp().getObject("Project") for name in names: project.getModel().updateVCSStatus(name) self.vcs.checkVCSStatus() - + def __restoreMissing(self): """ Private slot to handle the Restore Missing context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getMissingItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getMissingItems() + ] if not names: EricMessageBox.information( self, self.tr("Revert"), - self.tr("""There are no missing entries""" - """ available/selected.""")) + self.tr("""There are no missing entries""" """ available/selected."""), + ) return - + self.vcs.vcsRevert(names) self.on_refreshButton_clicked() self.vcs.checkVCSStatus() - + def __diff(self): """ Private slot to handle the Diff context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getModifiedItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getModifiedItems() + ] if not names: EricMessageBox.information( self, self.tr("Differences"), - self.tr("""There are no uncommitted changes""" - """ available/selected.""")) + self.tr( + """There are no uncommitted changes""" """ available/selected.""" + ), + ) return - + if self.diff is None: from .SvnDiffDialog import SvnDiffDialog + self.diff = SvnDiffDialog(self.vcs) self.diff.show() QApplication.processEvents() self.diff.start(names, refreshable=True) - + def __sbsDiff(self): """ Private slot to handle the Side-by-Side Diff context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getModifiedItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getModifiedItems() + ] if not names: EricMessageBox.information( self, self.tr("Side-by-Side Diff"), - self.tr("""There are no uncommitted changes""" - """ available/selected.""")) + self.tr( + """There are no uncommitted changes""" """ available/selected.""" + ), + ) return elif len(names) > 1: EricMessageBox.information( self, self.tr("Side-by-Side Diff"), - self.tr("""Only one file with uncommitted changes""" - """ must be selected.""")) + self.tr( + """Only one file with uncommitted changes""" + """ must be selected.""" + ), + ) return - + self.vcs.vcsSbsDiff(names[0]) - + def __lock(self): """ Private slot to handle the Lock context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getLockActionItems(self.unlockedIndicators)] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getLockActionItems(self.unlockedIndicators) + ] if not names: EricMessageBox.information( self, self.tr("Lock"), - self.tr("""There are no unlocked files""" - """ available/selected.""")) + self.tr("""There are no unlocked files""" """ available/selected."""), + ) return - + self.vcs.svnLock(names, parent=self) self.on_refreshButton_clicked() - + def __unlock(self): """ Private slot to handle the Unlock context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getLockActionItems(self.lockedIndicators)] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getLockActionItems(self.lockedIndicators) + ] if not names: EricMessageBox.information( self, self.tr("Unlock"), - self.tr("""There are no locked files""" - """ available/selected.""")) + self.tr("""There are no locked files""" """ available/selected."""), + ) return - + self.vcs.svnUnlock(names, parent=self) self.on_refreshButton_clicked() - + def __breakLock(self): """ Private slot to handle the Break Lock context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getLockActionItems( - self.stealBreakLockIndicators)] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getLockActionItems(self.stealBreakLockIndicators) + ] if not names: EricMessageBox.information( self, self.tr("Break Lock"), - self.tr("""There are no locked files""" - """ available/selected.""")) + self.tr("""There are no locked files""" """ available/selected."""), + ) return - + self.vcs.svnUnlock(names, parent=self, breakIt=True) self.on_refreshButton_clicked() @@ -938,17 +1016,18 @@ """ Private slot to handle the Break Lock context menu entry. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getLockActionItems( - self.stealBreakLockIndicators)] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getLockActionItems(self.stealBreakLockIndicators) + ] if not names: EricMessageBox.information( self, self.tr("Steal Lock"), - self.tr("""There are no locked files""" - """ available/selected.""")) + self.tr("""There are no locked files""" """ available/selected."""), + ) return - + self.vcs.svnLock(names, parent=self, stealIt=True) self.on_refreshButton_clicked() @@ -956,8 +1035,10 @@ """ Private slot to add entries to a changelist. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getNonChangelistItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getNonChangelistItems() + ] if not names: EricMessageBox.information( self, @@ -965,7 +1046,7 @@ self.tr( """There are no files available/selected not """ """belonging to a changelist.""" - ) + ), ) return self.vcs.svnAddToChangelist(names) @@ -975,8 +1056,10 @@ """ Private slot to remove entries from their changelists. """ - names = [os.path.join(self.dname, itm.text(self.__pathColumn)) - for itm in self.__getChangelistItems()] + names = [ + os.path.join(self.dname, itm.text(self.__pathColumn)) + for itm in self.__getChangelistItems() + ] if not names: EricMessageBox.information( self, @@ -984,7 +1067,7 @@ self.tr( """There are no files available/selected belonging""" """ to a changelist.""" - ) + ), ) return self.vcs.svnRemoveFromChangelist(names) @@ -993,39 +1076,36 @@ def __getCommitableItems(self): """ Private method to retrieve all entries the user wants to commit. - + @return list of all items, the user has checked """ commitableItems = [] for index in range(self.statusList.topLevelItemCount()): itm = self.statusList.topLevelItem(index) - if ( - itm.checkState(self.__toBeCommittedColumn) == - Qt.CheckState.Checked - ): + if itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Checked: commitableItems.append(itm) return commitableItems - + def __getModifiedItems(self): """ Private method to retrieve all entries, that have a modified status. - + @return list of all items with a modified status """ modifiedItems = [] for itm in self.statusList.selectedItems(): if ( - itm.text(self.__statusColumn) in self.modifiedIndicators or - itm.text(self.__propStatusColumn) in self.modifiedIndicators + itm.text(self.__statusColumn) in self.modifiedIndicators + or itm.text(self.__propStatusColumn) in self.modifiedIndicators ): modifiedItems.append(itm) return modifiedItems - + def __getUnversionedItems(self): """ Private method to retrieve all entries, that have an unversioned status. - + @return list of all items with an unversioned status """ unversionedItems = [] @@ -1033,11 +1113,11 @@ if itm.text(self.__statusColumn) in self.unversionedIndicators: unversionedItems.append(itm) return unversionedItems - + def __getMissingItems(self): """ Private method to retrieve all entries, that have a missing status. - + @return list of all items with a missing status """ missingItems = [] @@ -1045,11 +1125,11 @@ if itm.text(self.__statusColumn) in self.missingIndicators: missingItems.append(itm) return missingItems - + def __getLockActionItems(self, indicators): """ Private method to retrieve all emtries, that have a locked status. - + @param indicators list of indicators to check against (list of strings) @return list of all items with a locked status """ @@ -1058,12 +1138,12 @@ if itm.text(self.__lockinfoColumn) in indicators: lockitems.append(itm) return lockitems - + def __getChangelistItems(self): """ Private method to retrieve all entries, that are members of a changelist. - + @return list of all items belonging to a changelist """ clitems = [] @@ -1071,12 +1151,12 @@ if itm.text(self.__changelistColumn) != "": clitems.append(itm) return clitems - + def __getNonChangelistItems(self): """ Private method to retrieve all entries, that are not members of a changelist. - + @return list of all items not belonging to a changelist """ clitems = [] @@ -1084,22 +1164,22 @@ if itm.text(self.__changelistColumn) == "": clitems.append(itm) return clitems - + def __commitSelect(self, selected): """ Private slot to select or deselect all entries. - + @param selected commit selection state to be set (boolean) """ for index in range(self.statusList.topLevelItemCount()): itm = self.statusList.topLevelItem(index) if ( - itm.flags() & Qt.ItemFlag.ItemIsUserCheckable == - Qt.ItemFlag.ItemIsUserCheckable + itm.flags() & Qt.ItemFlag.ItemIsUserCheckable + == Qt.ItemFlag.ItemIsUserCheckable ): if selected: - itm.setCheckState(self.__toBeCommittedColumn, - Qt.CheckState.Checked) + itm.setCheckState(self.__toBeCommittedColumn, Qt.CheckState.Checked) else: - itm.setCheckState(self.__toBeCommittedColumn, - Qt.CheckState.Unchecked) + itm.setCheckState( + self.__toBeCommittedColumn, Qt.CheckState.Unchecked + )