src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py

branch
eric7
changeset 9221
bf71ee032bb4
parent 9209
b99e7fd55fd3
child 9413
80c06d472826
--- a/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Wed Jul 13 11:16:20 2022 +0200
+++ b/src/eric7/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py	Wed Jul 13 14:55:47 2022 +0200
@@ -13,7 +13,11 @@
 from PyQt6.QtCore import pyqtSlot, Qt, QSize
 from PyQt6.QtGui import QTextCursor
 from PyQt6.QtWidgets import (
-    QWidget, QDialogButtonBox, QMenu, QHeaderView, QTreeWidgetItem
+    QWidget,
+    QDialogButtonBox,
+    QMenu,
+    QHeaderView,
+    QTreeWidgetItem,
 )
 
 from EricWidgets.EricApplication import ericApp
@@ -33,77 +37,75 @@
     Class implementing a dialog to show the output of the hg status command
     process.
     """
+
     def __init__(self, vcs, mq=False, parent=None):
         """
         Constructor
-        
+
         @param vcs reference to the vcs object
         @param mq flag indicating to show a queue repo status (boolean)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
         self.setupUi(self)
-        
+
         self.__toBeCommittedColumn = 0
         self.__statusColumn = 1
         self.__pathColumn = 2
         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.__hgClient = self.vcs.getClient()
         self.__mq = mq
-        
+
         self.statusList.headerItem().setText(self.__lastColumn, "")
         self.statusList.header().setSortIndicator(
-            self.__pathColumn, Qt.SortOrder.AscendingOrder)
-        
+            self.__pathColumn, Qt.SortOrder.AscendingOrder
+        )
+
         font = Preferences.getEditorOtherFonts("MonospacedFont")
         self.diffEdit.document().setDefaultFont(font)
-        
+
         self.diffHighlighter = HgDiffHighlighter(self.diffEdit.document())
         self.__diffGenerator = HgDiffGenerator(vcs, self)
         self.__diffGenerator.finished.connect(self.__generatorFinished)
-        
+
         self.__selectedName = ""
-        
+
         self.modifiedIndicators = [
-            self.tr('added'),
-            self.tr('modified'),
-            self.tr('removed'),
+            self.tr("added"),
+            self.tr("modified"),
+            self.tr("removed"),
         ]
-        
+
         self.unversionedIndicators = [
-            self.tr('not tracked'),
+            self.tr("not tracked"),
         ]
-        
-        self.missingIndicators = [
-            self.tr('missing')
-        ]
-        
+
+        self.missingIndicators = [self.tr("missing")]
+
         self.status = {
-            'A': self.tr('added'),
-            'C': self.tr('normal'),
-            'I': self.tr('ignored'),
-            'M': self.tr('modified'),
-            'R': self.tr('removed'),
-            '?': self.tr('not tracked'),
-            '!': self.tr('missing'),
+            "A": self.tr("added"),
+            "C": self.tr("normal"),
+            "I": self.tr("ignored"),
+            "M": self.tr("modified"),
+            "R": self.tr("removed"),
+            "?": self.tr("not tracked"),
+            "!": self.tr("missing"),
         }
-        
+
         self.__initActionsMenu()
-        
+
         if mq:
             self.diffLabel.setVisible(False)
             self.diffEdit.setVisible(False)
@@ -111,7 +113,7 @@
             self.diffSplitter.setSizes([600, 0])
         else:
             self.diffSplitter.setSizes([300, 300])
-    
+
     def __initActionsMenu(self):
         """
         Private method to initialize the actions menu.
@@ -120,213 +122,237 @@
         self.__actionsMenu.setTearOffEnabled(True)
         self.__actionsMenu.setToolTipsVisible(True)
         self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu)
-        
+
         self.__commitAct = self.__actionsMenu.addAction(
-            self.tr("Commit"), self.__commit)
+            self.tr("Commit"), self.__commit
+        )
         self.__commitAct.setToolTip(self.tr("Commit the selected changes"))
         self.__commitSelectAct = self.__actionsMenu.addAction(
-            self.tr("Select all for commit"), self.__commitSelectAll)
+            self.tr("Select all for commit"), self.__commitSelectAll
+        )
         self.__commitDeselectAct = self.__actionsMenu.addAction(
-            self.tr("Unselect all from commit"), self.__commitDeselectAll)
-        
+            self.tr("Unselect all from commit"), self.__commitDeselectAll
+        )
+
         self.__actionsMenu.addSeparator()
-        
-        self.__addAct = self.__actionsMenu.addAction(
-            self.tr("Add"), self.__add)
+
+        self.__addAct = self.__actionsMenu.addAction(self.tr("Add"), self.__add)
         self.__addAct.setToolTip(self.tr("Add the selected files"))
         self.__lfAddLargeAct = self.__actionsMenu.addAction(
-            self.tr("Add as Large Files"), lambda: self.__lfAdd("large"))
-        self.__lfAddLargeAct.setToolTip(self.tr(
-            "Add the selected files as a large files using the 'Large Files'"
-            " extension"))
+            self.tr("Add as Large Files"), lambda: self.__lfAdd("large")
+        )
+        self.__lfAddLargeAct.setToolTip(
+            self.tr(
+                "Add the selected files as a large files using the 'Large Files'"
+                " extension"
+            )
+        )
         self.__lfAddNormalAct = self.__actionsMenu.addAction(
-            self.tr("Add as Normal Files"), lambda: self.__lfAdd("normal"))
-        self.__lfAddNormalAct.setToolTip(self.tr(
-            "Add the selected files as a normal files using the 'Large Files'"
-            " extension"))
-        
+            self.tr("Add as Normal Files"), lambda: self.__lfAdd("normal")
+        )
+        self.__lfAddNormalAct.setToolTip(
+            self.tr(
+                "Add the selected files as a normal files using the 'Large Files'"
+                " extension"
+            )
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__diffAct = self.__actionsMenu.addAction(
-            self.tr("Differences"), self.__diff)
-        self.__diffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry in a"
-            " separate dialog"))
+            self.tr("Differences"), self.__diff
+        )
+        self.__diffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry in a" " separate dialog"
+            )
+        )
         self.__sbsDiffAct = self.__actionsMenu.addAction(
-            self.tr("Differences Side-By-Side"), self.__sbsDiff)
-        self.__sbsDiffAct.setToolTip(self.tr(
-            "Shows the differences of the selected entry side-by-side in"
-            " a separate dialog"))
-        
+            self.tr("Differences Side-By-Side"), self.__sbsDiff
+        )
+        self.__sbsDiffAct.setToolTip(
+            self.tr(
+                "Shows the differences of the selected entry side-by-side in"
+                " a separate dialog"
+            )
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__revertAct = self.__actionsMenu.addAction(
-            self.tr("Revert"), self.__revert)
-        self.__revertAct.setToolTip(self.tr(
-            "Reverts the changes of the selected files"))
-        
+            self.tr("Revert"), self.__revert
+        )
+        self.__revertAct.setToolTip(
+            self.tr("Reverts the changes of the selected files")
+        )
+
         self.__actionsMenu.addSeparator()
-        
+
         self.__forgetAct = self.__actionsMenu.addAction(
-            self.tr("Forget Missing"), self.__forget)
-        self.__forgetAct.setToolTip(self.tr(
-            "Forgets about the selected missing files"))
+            self.tr("Forget Missing"), self.__forget
+        )
+        self.__forgetAct.setToolTip(self.tr("Forgets about the selected missing files"))
         self.__restoreAct = self.__actionsMenu.addAction(
-            self.tr("Restore Missing"), self.__restoreMissing)
-        self.__restoreAct.setToolTip(self.tr(
-            "Restores the selected missing files"))
-        
+            self.tr("Restore Missing"), self.__restoreMissing
+        )
+        self.__restoreAct.setToolTip(self.tr("Restores the selected missing files"))
+
         self.__actionsMenu.addSeparator()
 
         self.__commitMergeAct = self.__actionsMenu.addAction(
-            self.tr("Commit Merge"), self.__commitMerge)
-        self.__commitMergeAct.setToolTip(self.tr("Commit all the merged"
-                                                 " changes."))
+            self.tr("Commit Merge"), self.__commitMerge
+        )
+        self.__commitMergeAct.setToolTip(self.tr("Commit all the merged" " changes."))
         self.__abortMergeAct = self.__actionsMenu.addAction(
-            self.tr("Abort Merge"), self.__abortMerge)
-        self.__commitMergeAct.setToolTip(self.tr("Abort an uncommitted merge "
-                                                 "and lose all changes"))
+            self.tr("Abort Merge"), self.__abortMerge
+        )
+        self.__commitMergeAct.setToolTip(
+            self.tr("Abort an uncommitted merge " "and lose all changes")
+        )
 
         self.__actionsMenu.addSeparator()
-        
+
         act = self.__actionsMenu.addAction(
-            self.tr("Adjust column sizes"), self.__resizeColumns)
-        act.setToolTip(self.tr(
-            "Adjusts the width of all columns to their contents"))
-        
-        self.actionsButton.setIcon(
-            UI.PixmapCache.getIcon("actionsToolButton"))
+            self.tr("Adjust column sizes"), self.__resizeColumns
+        )
+        act.setToolTip(self.tr("Adjusts the width of all columns to their contents"))
+
+        self.actionsButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton"))
         self.actionsButton.setMenu(self.__actionsMenu)
-    
+
     def closeEvent(self, e):
         """
         Protected slot implementing a close event handler.
-        
+
         @param e close event (QCloseEvent)
         """
         if self.__hgClient.isExecuting():
             self.__hgClient.cancel()
-        
+
         if self.__mq:
             self.vcs.getPlugin().setPreferences(
-                "MqStatusDialogGeometry", self.saveGeometry())
+                "MqStatusDialogGeometry", self.saveGeometry()
+            )
             self.vcs.getPlugin().setPreferences(
-                "MqStatusDialogSplitterState", self.diffSplitter.saveState())
+                "MqStatusDialogSplitterState", self.diffSplitter.saveState()
+            )
         else:
             self.vcs.getPlugin().setPreferences(
-                "StatusDialogGeometry", self.saveGeometry())
+                "StatusDialogGeometry", self.saveGeometry()
+            )
             self.vcs.getPlugin().setPreferences(
-                "StatusDialogSplitterState", self.diffSplitter.saveState())
-        
+                "StatusDialogSplitterState", self.diffSplitter.saveState()
+            )
+
         e.accept()
-    
+
     def show(self):
         """
         Public slot to show the dialog.
         """
         super().show()
-        
+
         geom = (
             self.vcs.getPlugin().getPreferences("MqStatusDialogGeometry")
-            if self.__mq else
-            self.vcs.getPlugin().getPreferences("StatusDialogGeometry")
+            if self.__mq
+            else self.vcs.getPlugin().getPreferences("StatusDialogGeometry")
         )
         if geom.isEmpty():
             s = QSize(800, 600)
             self.resize(s)
         else:
             self.restoreGeometry(geom)
-        
+
         diffSplitterState = (
             self.vcs.getPlugin().getPreferences("MqStatusDialogSplitterState")
-            if self.__mq else
-            self.vcs.getPlugin().getPreferences("StatusDialogSplitterState")
+            if self.__mq
+            else self.vcs.getPlugin().getPreferences("StatusDialogSplitterState")
         )
         if diffSplitterState is not None:
             self.diffSplitter.restoreState(diffSplitterState)
-    
+
     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, path):
         """
         Private method to generate a status item in the status list.
-        
+
         @param status status indicator (string)
         @param path path of the file or directory (string)
         """
         statusText = self.status[status]
-        itm = QTreeWidgetItem(self.statusList, [
-            "",
-            statusText,
-            path,
-        ])
-        
+        itm = QTreeWidgetItem(
+            self.statusList,
+            [
+                "",
+                statusText,
+                path,
+            ],
+        )
+
         itm.setTextAlignment(1, Qt.AlignmentFlag.AlignHCenter)
         itm.setTextAlignment(2, Qt.AlignmentFlag.AlignLeft)
-    
+
         if status in "AMR":
             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)
-        
+
         if statusText not in self.__statusFilters:
             self.__statusFilters.append(statusText)
-        
+
     def start(self, fn):
         """
         Public slot to start the hg 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
-        
+
         self.actionsButton.setEnabled(False)
-        
+
         self.statusFilterCombo.clear()
         self.__statusFilters = []
         self.statusList.clear()
-        
+
         if self.__mq:
-            self.setWindowTitle(
-                self.tr("Mercurial Queue Repository Status"))
+            self.setWindowTitle(self.tr("Mercurial Queue Repository Status"))
         else:
-            self.setWindowTitle(self.tr('Mercurial Status'))
-        
+            self.setWindowTitle(self.tr("Mercurial Status"))
+
         args = self.vcs.initCommand("status")
         if self.__mq:
-            args.append('--mq')
+            args.append("--mq")
         else:
             if self.vcs.hasSubrepositories():
                 args.append("--subrepos")
-            
+
             if isinstance(fn, list):
                 self.vcs.addArguments(args, fn)
             else:
                 args.append(fn)
-        
+
         self.refreshButton.setEnabled(False)
-        
+
         self.__repoPath = self.__hgClient.getRepository()
-        
+
         out, err = self.__hgClient.runcommand(args)
         if err:
             self.__showError(err)
@@ -336,73 +362,66 @@
                 if self.__hgClient.wasCanceled():
                     break
         self.__finish()
-    
+
     def __finish(self):
         """
         Private slot called when the process finished or the user pressed
         the button.
         """
         self.refreshButton.setEnabled(True)
-        
-        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.__statusFilters.sort()
         self.__statusFilters.insert(0, "<{0}>".format(self.tr("all")))
         self.statusFilterCombo.addItems(self.__statusFilters)
-        
+
         if not self.__mq:
             self.actionsButton.setEnabled(True)
-        
+
         self.__resort()
         self.__resizeColumns()
-        
+
         self.__refreshDiff()
-    
+
     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.__hgClient.cancel()
         elif button == self.refreshButton:
             self.on_refreshButton_clicked()
-    
+
     def __processOutputLine(self, line):
         """
         Private method to process the lines of output.
-        
+
         @param line output line to be processed (string)
         """
         if line[0] in "ACIMR?!" and line[1] == " ":
             status, path = line.strip().split(" ", 1)
             self.__generateItem(status, path)
-    
+
     def __showError(self, out):
         """
         Private slot to show some error.
-        
+
         @param out error to be shown (string)
         """
         self.errorGroup.show()
         self.errors.insertPlainText(out)
         self.errors.ensureCursorVisible()
-    
+
     @pyqtSlot()
     def on_refreshButton_clicked(self):
         """
@@ -413,14 +432,14 @@
             self.__selectedName = selectedItems[0].text(self.__pathColumn)
         else:
             self.__selectedName = ""
-        
+
         self.start(self.args)
-    
+
     @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
         """
@@ -433,18 +452,18 @@
             for topIndex in range(self.statusList.topLevelItemCount()):
                 topItem = self.statusList.topLevelItem(topIndex)
                 topItem.setHidden(topItem.text(self.__statusColumn) != txt)
-    
+
     @pyqtSlot()
     def on_statusList_itemSelectionChanged(self):
         """
         Private slot to act upon changes of selected items.
         """
         self.__generateDiffs()
-    
+
     ###########################################################################
     ## Menu handling methods
     ###########################################################################
-    
+
     def __showActionsMenu(self):
         """
         Private slot to prepare the actions button menu before it is shown.
@@ -475,7 +494,7 @@
             missing = len(self.__getMissingItems())
             commitable = len(self.__getCommitableItems())
             commitableUnselected = len(self.__getCommitableUnselectedItems())
-    
+
             self.__addAct.setEnabled(unversioned)
             self.__diffAct.setEnabled(modified)
             self.__sbsDiffAct.setEnabled(modified == 1)
@@ -485,14 +504,14 @@
             self.__commitAct.setEnabled(commitable)
             self.__commitSelectAct.setEnabled(commitableUnselected)
             self.__commitDeselectAct.setEnabled(commitable)
-            
+
             if self.vcs.isExtensionActive("largefiles"):
                 enable = bool(unversioned)
             else:
                 enable = False
             self.__lfAddLargeAct.setEnabled(enable)
             self.__lfAddNormalAct.setEnabled(enable)
-    
+
     def __commit(self):
         """
         Private slot to handle the Commit context menu entry.
@@ -500,22 +519,26 @@
         if self.__mq:
             self.vcs.vcsCommit(self.__repoPath, "", mq=True)
         else:
-            names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                     for itm in self.__getCommitableItems()]
+            names = [
+                os.path.join(self.__repoPath, 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.
@@ -523,207 +546,229 @@
         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.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getUnversionedItems()]
+        names = [
+            os.path.join(self.__repoPath, 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 __lfAdd(self, mode):
         """
         Private slot to add a file to the repository.
-        
+
         @param mode add mode (string one of 'normal' or 'large')
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getUnversionedItems()]
+        names = [
+            os.path.join(self.__repoPath, 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.getExtensionObject("largefiles").hgAdd(
-            names, mode)
+
+        self.vcs.getExtensionObject("largefiles").hgAdd(names, mode)
         self.on_refreshButton_clicked()
-        
+
         project = ericApp().getObject("Project")
         for name in names:
             project.getModel().updateVCSStatus(name)
         self.vcs.checkVCSStatus()
-    
+
     def __forget(self):
         """
         Private slot to handle the Forget Missing context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Forget Missing"),
-                self.tr("""There are no missing entries"""
-                        """ available/selected."""))
+                self.tr("""There are no missing entries""" """ available/selected."""),
+            )
             return
-        
+
         self.vcs.vcsForget(names)
         self.on_refreshButton_clicked()
-    
+
     def __revert(self):
         """
         Private slot to handle the Revert context menu entry.
         """
-        names = [os.path.join(self.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.__repoPath, 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.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getMissingItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getMissingItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Restore Missing"),
-                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.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.__repoPath, 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 .HgDiffDialog import HgDiffDialog
+
             self.diff = HgDiffDialog(self.vcs)
         self.diff.show()
         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.__repoPath, itm.text(self.__pathColumn))
-                 for itm in self.__getModifiedItems()]
+        names = [
+            os.path.join(self.__repoPath, itm.text(self.__pathColumn))
+            for itm in self.__getModifiedItems()
+        ]
         if not names:
             EricMessageBox.information(
                 self,
                 self.tr("Differences Side-By-Side"),
-                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("Differences Side-By-Side"),
-                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 __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 __getCommitableUnselectedItems(self):
         """
         Private method to retrieve all entries the user may commit but hasn't
         selected.
-        
+
         @return list of all items, the user has checked
         """
         items = []
         for index in range(self.statusList.topLevelItemCount()):
             itm = self.statusList.topLevelItem(index)
             if (
-                (itm.flags() & Qt.ItemFlag.ItemIsUserCheckable ==
-                 Qt.ItemFlag.ItemIsUserCheckable) and
-                itm.checkState(self.__toBeCommittedColumn) ==
-                Qt.CheckState.Unchecked
-            ):
+                itm.flags() & Qt.ItemFlag.ItemIsUserCheckable
+                == Qt.ItemFlag.ItemIsUserCheckable
+            ) and itm.checkState(self.__toBeCommittedColumn) == Qt.CheckState.Unchecked:
                 items.append(itm)
         return items
-    
+
     def __getModifiedItems(self):
         """
         Private method to retrieve all entries, that have a modified status.
-        
+
         @return list of all items with a modified status
         """
         modifiedItems = []
@@ -731,12 +776,12 @@
             if itm.text(self.__statusColumn) 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 = []
@@ -744,11 +789,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 = []
@@ -756,31 +801,31 @@
             if itm.text(self.__statusColumn) in self.missingIndicators:
                 missingItems.append(itm)
         return missingItems
-    
+
     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
+                    )
+
     def __commitMerge(self):
         """
         Private slot to handle the Commit Merge context menu entry.
         """
-        self.vcs.vcsCommit(self.__repoPath, self.tr('Merge'), merge=True)
+        self.vcs.vcsCommit(self.__repoPath, self.tr("Merge"), merge=True)
         self.__committed()
 
     def __abortMerge(self):
@@ -793,27 +838,28 @@
     ###########################################################################
     ## Diff handling methods below
     ###########################################################################
-    
+
     def __generateDiffs(self):
         """
         Private slot to generate diff outputs for the selected item.
         """
         self.diffEdit.clear()
         self.diffHighlighter.regenerateRules()
-        
+
         if not self.__mq:
             selectedItems = self.statusList.selectedItems()
             if len(selectedItems) == 1:
-                fn = os.path.join(self.__repoPath,
-                                  selectedItems[0].text(self.__pathColumn))
+                fn = os.path.join(
+                    self.__repoPath, selectedItems[0].text(self.__pathColumn)
+                )
                 self.__diffGenerator.start(fn)
-    
+
     def __generatorFinished(self):
         """
         Private slot connected to the finished signal of the diff generator.
         """
         diff = self.__diffGenerator.getResult()[0]
-        
+
         if diff:
             for line in diff[:]:
                 if line.startswith("@@ "):
@@ -821,12 +867,12 @@
                 else:
                     diff.pop(0)
             self.diffEdit.setPlainText("".join(diff))
-        
+
         tc = self.diffEdit.textCursor()
         tc.movePosition(QTextCursor.MoveOperation.Start)
         self.diffEdit.setTextCursor(tc)
         self.diffEdit.ensureCursorVisible()
-    
+
     def __refreshDiff(self):
         """
         Private method to refresh the diff output after a refresh.
@@ -837,5 +883,5 @@
                 if itm.text(self.__pathColumn) == self.__selectedName:
                     itm.setSelected(True)
                     break
-        
+
         self.__selectedName = ""

eric ide

mercurial