eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

changeset 7010
5d6f5a69a952
parent 7009
eaf5ed6ef298
child 7032
1dd0c392f685
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Sun May 12 15:31:23 2019 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Tue May 14 19:52:39 2019 +0200
@@ -293,6 +293,11 @@
             self.__tagActTriggered)
         self.__tagAct.setToolTip(self.tr("Tag the selected revision"))
         
+        self.__closeHeadsAct = self.__actionsMenu.addAction(
+            UI.PixmapCache.getIcon("closehead"), self.tr("Close Heads"),
+            self.__closeHeadsActTriggered)
+        self.__closeHeadsAct.setToolTip(self.tr("Close the selected heads"))
+        
         self.__switchAct = self.__actionsMenu.addAction(
             UI.PixmapCache.getIcon("vcsSwitch.png"), self.tr("Switch"),
             self.__switchActTriggered)
@@ -879,6 +884,50 @@
                     self.__closedBranchesRevs.append(
                         parts[-2].split(":", 1)[0])
     
+    def __getHeads(self):
+        """
+        Private method to get the list of all heads.
+        """
+        self.__headRevisions = []
+        errMsg = ""
+        
+        args = self.vcs.initCommand("heads")
+        args.append("--closed")
+        args.append("--template")
+        args.append("{rev}\n")
+        
+        output = ""
+        if self.__hgClient:
+            output, errMsg = self.__hgClient.runcommand(args)
+        else:
+            process = QProcess()
+            process.setWorkingDirectory(self.repodir)
+            process.start('hg', args)
+            procStarted = process.waitForStarted(5000)
+            if procStarted:
+                finished = process.waitForFinished(30000)
+                if finished and process.exitCode() == 0:
+                    output = str(process.readAllStandardOutput(),
+                                 self.vcs.getEncoding(), 'replace')
+                else:
+                    if not finished:
+                        errMsg = self.tr(
+                            "The hg process did not finish within 30s.")
+            else:
+                errMsg = self.tr("Could not start the hg executable.")
+        
+        if errMsg:
+            E5MessageBox.critical(
+                self,
+                self.tr("Mercurial Error"),
+                errMsg)
+        
+        if output:
+            for line in output.splitlines():
+                line = line.strip()
+                if line:
+                    self.__headRevisions.append(line)
+    
     def __getRevisionOfTag(self, tag):
         """
         Private method to get the revision of a tag.
@@ -1204,6 +1253,7 @@
         self.__started = True
         self.__identifyProject()
         self.__getClosedBranches()
+        self.__getHeads()
         self.__getLogEntries(noEntries=noEntries)
     
     def __procFinished(self, exitCode, exitStatus):
@@ -1633,6 +1683,14 @@
                 self.vcs.isExtensionActive("gpg") and
                 selectedItemsCount == 1)
             
+            if self.vcs.isExtensionActive("closehead"):
+                revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+                        for itm in self.logTree.selectedItems()
+                        if not itm.data(0, self.__incomingRole)]
+                revs = [rev for rev in revs if rev in self.__headRevisions]
+                self.__closeHeadsAct.setEnabled(len(revs) > 0)
+            else:
+                self.__closeHeadsAct.setEnabled(False)
             self.actionsButton.setEnabled(True)
         
         elif self.initialCommandMode == "incoming" and self.projectMode:
@@ -2196,6 +2254,24 @@
                 self.on_refreshButton_clicked()
     
     @pyqtSlot()
+    def __closeHeadsActTriggered(self):
+        """
+        Private slot to close the selected head revisions.
+        """
+        if self.vcs.isExtensionActive("closehead"):
+            revs = [itm.text(self.RevisionColumn).strip().split(":", 1)[0]
+                    for itm in self.logTree.selectedItems()
+                    if not itm.data(0, self.__incomingRole)]
+            revs = [rev for rev in revs if rev in self.__headRevisions]
+            if revs:
+                closeheadExtension = self.vcs.getExtensionObject("closehead")
+                if closeheadExtension is not None:
+                    closeheadExtension.hgCloseheads(
+                        self.repodir, revisions=revs)
+                    
+                    self.on_refreshButton_clicked()
+    
+    @pyqtSlot()
     def __switchActTriggered(self):
         """
         Private slot to switch the working directory to the

eric ide

mercurial