--- 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