--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py Sat May 11 11:29:48 2019 +0200 +++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py Sun May 12 15:31:23 2019 +0200 @@ -63,13 +63,16 @@ ClosedIndicator = " \u2612" - def __init__(self, vcs, mode="log", parent=None): + def __init__(self, vcs, mode="", parent=None): """ Constructor @param vcs reference to the vcs object - @param mode mode of the dialog (string; one of log, incoming, outgoing) - @param parent parent widget (QWidget) + @type Hg + @param mode mode of the dialog + @type str (one of log, full_log, incoming, outgoing) + @param parent parent widget + @type QWidget """ super(HgLogBrowserDialog, self).__init__(parent) self.setupUi(self) @@ -84,12 +87,20 @@ self.diffSplitter.setStretchFactor(0, 1) self.diffSplitter.setStretchFactor(1, 2) + if not mode: + if vcs.getPlugin().getPreferences("LogBrowserShowFullLog"): + mode = "full_log" + else: + mode = "log" + if mode == "log": self.setWindowTitle(self.tr("Mercurial Log")) elif mode == "incoming": self.setWindowTitle(self.tr("Mercurial Log (Incoming)")) elif mode == "outgoing": self.setWindowTitle(self.tr("Mercurial Log (Outgoing)")) + elif mode == "full_log": + self.setWindowTitle(self.tr("Mercurial Full Log")) self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True) @@ -117,6 +128,7 @@ self.fieldCombo.addItem(self.tr("Author"), "author") self.fieldCombo.addItem(self.tr("Message"), "message") self.fieldCombo.addItem(self.tr("File"), "file") + self.fieldCombo.addItem(self.tr("Phase"), "phase") font = Preferences.getEditorOtherFonts("MonospacedFont") self.diffEdit.setFontFamily(font.family()) @@ -127,8 +139,11 @@ self.__diffGenerator.finished.connect(self.__generatorFinished) self.vcs = vcs - if mode in ("log", "incoming", "outgoing"): - self.commandMode = mode + if mode in ("log", "incoming", "outgoing", "full_log"): + if mode == "full_log": + self.commandMode = "incoming" + else: + self.commandMode = mode self.initialCommandMode = mode else: self.commandMode = "log" @@ -181,6 +196,7 @@ self.__edgesRole = Qt.UserRole + 2 self.__parentsRole = Qt.UserRole + 3 self.__latestTagRole = Qt.UserRole + 4 + self.__incomingRole = Qt.UserRole + 5 # roles used in the file tree self.__diffFileLineRole = Qt.UserRole @@ -224,6 +240,8 @@ self.__initActionsMenu() self.__finishCallbacks = [] + if self.initialCommandMode == "full_log": + self.__addFinishCallback(self.on_nextButton_clicked) def __addFinishCallback(self, callback): """ @@ -499,7 +517,10 @@ self.logTree.clear() - self.commandMode = self.initialCommandMode + if self.initialCommandMode == "full_log": + self.commandMode = "incoming" + else: + self.commandMode = self.initialCommandMode def __resizeColumnsLog(self): """ @@ -595,23 +616,31 @@ return col, color, edges def __generateIcon(self, column, color, bottomedges, topedges, dotColor, - currentRev, closed): + currentRev, closed, isDraft): """ Private method to generate an icon containing the revision tree for the given data. - @param column column index of the revision (integer) - @param color color of the node (integer) + @param column column index of the revision + @type int + @param color color of the node + @type int @param bottomedges list of edges for the bottom of the node - (list of tuples of three integers) + @type list of tuples of (int, int, int) @param topedges list of edges for the top of the node - (list of tuples of three integers) - @param dotColor color to be used for the dot (QColor) + @type list of tuples of (int, int, int) + @param dotColor color to be used for the dot + @type QColor @param currentRev flag indicating to draw the icon for the - current revision (boolean) + current revision + @type bool @param closed flag indicating to draw an icon for a closed - branch (boolean) - @return icon for the node (QIcon) + branch + @type bool + @param isDraft flag indicating an entry of phase 'draft' + @type bool + @return icon for the node + @rtype QIcon """ def col2x(col, radius): """ @@ -678,21 +707,30 @@ elif self.commandMode in ("incoming", "outgoing"): offset = radius // 2 if self.commandMode == "incoming": - # incoming, draw a down arrow + # incoming: draw a down arrow painter.drawConvexPolygon( QPoint(dot_x, dot_y), QPoint(dot_x + 2 * offset, dot_y), QPoint(dot_x + offset, dot_y + 2 * offset) ) else: - # outgoing, draw an up arrow + # outgoing: draw an up arrow painter.drawConvexPolygon( QPoint(dot_x + offset, dot_y), QPoint(dot_x, dot_y + 2 * offset), QPoint(dot_x + 2 * offset, dot_y + 2 * offset) ) else: - painter.drawEllipse(dot_x, dot_y, radius, radius) + if isDraft: + # 'draft' phase: draw an up arrow like outgoing + offset = radius // 2 + painter.drawConvexPolygon( + QPoint(dot_x + offset, dot_y), + QPoint(dot_x, dot_y + 2 * offset), + QPoint(dot_x + 2 * offset, dot_y + 2 * offset) + ) + else: + painter.drawEllipse(dot_x, dot_y, radius, radius) painter.end() return QIcon(pix) @@ -970,6 +1008,7 @@ itm.setData(0, self.__parentsRole, parents) for parent in parents: self.__childrenInfo[parent].append(int(rev)) + itm.setData(0, self.__incomingRole, self.commandMode == "incoming") if self.logTree.topLevelItemCount() > 1: topedges = \ @@ -982,7 +1021,8 @@ icon = self.__generateIcon(column, color, edges, topedges, QColor(self.__branchColor(branches[0])), rev == self.__projectRevision, - rev in self.__closedBranchesRevs) + rev in self.__closedBranchesRevs, + phase == "draft") itm.setIcon(0, icon) try: @@ -1064,7 +1104,12 @@ else: err = "" if err: - self.__showError(err) + if self.commandMode == "incoming" and \ + self.initialCommandMode == "full_log": + # ignore the error + self.commandMode = "log" + else: + self.__showError(err) elif self.commandMode != "incoming" or \ (self.vcs.bundleFile and os.path.exists(self.vcs.bundleFile)) or \ @@ -1074,6 +1119,10 @@ if err: self.__showError(err) self.__processBuffer() + elif self.commandMode == "incoming" and \ + self.initialCommandMode == "full_log": + # no incoming changesets, just switch to log mode + self.commandMode = "log" self.__finish() else: self.process.kill() @@ -1120,9 +1169,18 @@ self.__bundle = bundle self.__isFile = isFile + if self.initialCommandMode == "full_log": + if isFile: + self.commandMode = "log" + self.__finishCallbacks = [] + else: + self.commandMode = "incoming" + self.__addFinishCallback(self.on_nextButton_clicked) + self.sbsSelectLabel.clear() self.errorGroup.hide() + self.errors.clear() QApplication.processEvents() self.__initData() @@ -1311,17 +1369,20 @@ self.__resizeColumnsLog() if self.__started: - if self.__selectedRevisions: - foundItems = self.logTree.findItems( - self.__selectedRevisions[0], Qt.MatchExactly, - self.RevisionColumn) - if foundItems: - self.logTree.setCurrentItem(foundItems[0]) + if not self.__finishCallbacks: + # we are really done + if self.__selectedRevisions: + foundItems = self.logTree.findItems( + self.__selectedRevisions[0], Qt.MatchExactly, + self.RevisionColumn) + if foundItems: + self.logTree.setCurrentItem(foundItems[0]) + else: + self.logTree.setCurrentItem( + self.logTree.topLevelItem(0)) else: self.logTree.setCurrentItem(self.logTree.topLevelItem(0)) - else: - self.logTree.setCurrentItem(self.logTree.topLevelItem(0)) - self.__started = False + self.__started = False if self.commandMode in ("incoming", "outgoing"): self.commandMode = "log" # switch to log mode @@ -1356,8 +1417,9 @@ self.__filterLogs() self.__updateToolMenuActions() - # restore current item - if self.__selectedRevisions: + # restore selected item + if self.__selectedRevisions and not self.__finishCallbacks: + # we are really done for revision in self.__selectedRevisions: items = self.logTree.findItems( revision, Qt.MatchExactly, self.RevisionColumn) @@ -1460,13 +1522,15 @@ Private slot to update the status of the tool menu actions and the tool menu button. """ - if self.initialCommandMode == "log" and self.projectMode: + if self.initialCommandMode in ("log", "full_log") and self.projectMode: # do the phase action # step 1: count entries with changeable phases secret = 0 draft = 0 public = 0 - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: + # count phase for local items only phase = itm.text(self.PhaseColumn) if phase == self.phases["draft"]: draft += 1 @@ -1487,7 +1551,9 @@ # step 1: count selected entries not belonging to the # current branch otherBranches = 0 - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: + # for local items only branch = itm.text(self.BranchColumn) if branch != self.__projectBranch: otherBranches += 1 @@ -1495,15 +1561,27 @@ # step 2: set the status of the graft action self.__graftAct.setEnabled(otherBranches > 0) - selectedItemsCount = len(self.logTree.selectedItems()) + selectedItemsCount = len([ + itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole) + ]) + selectedIncomingItemsCount = len([ + itm for itm in self.logTree.selectedItems() + if itm.data(0, self.__incomingRole) + ]) + self.__mergeAct.setEnabled(selectedItemsCount == 1) self.__tagAct.setEnabled(selectedItemsCount == 1) self.__switchAct.setEnabled(selectedItemsCount == 1) self.__bookmarkAct.setEnabled(selectedItemsCount == 1) self.__bookmarkMoveAct.setEnabled(selectedItemsCount == 1) - self.__pullAct.setText(self.tr("Pull Changes")) - self.__fetchAct.setText(self.tr("Fetch Changes")) + if selectedIncomingItemsCount > 0: + self.__pullAct.setText(self.tr("Pull Selected Changes")) + self.__fetchAct.setText(self.tr("Fetch Selected Changes")) + else: + self.__pullAct.setText(self.tr("Pull Changes")) + self.__fetchAct.setText(self.tr("Fetch Changes")) if self.vcs.canPull(): self.__pullAct.setEnabled(True) self.__lfPullAct.setEnabled( @@ -1519,6 +1597,8 @@ if self.vcs.canPush(): self.__pushAct.setEnabled( selectedItemsCount == 1 and + not self.logTree.selectedItems()[0].data( + 0, self.__incomingRole) and self.logTree.selectedItems()[0].text(self.PhaseColumn) == self.phases["draft"]) self.__pushAllAct.setEnabled(True) @@ -1530,7 +1610,20 @@ self.vcs.isExtensionActive("strip") and selectedItemsCount == 1) - self.__bundleAct.setEnabled(self.logTree.topLevelItemCount() > 0) + # count incoming items for 'full_log' + if self.initialCommandMode == "full_log": + # incoming items are at the top + incomingCount = 0 + for row in range(self.logTree.topLevelItemCount()): + if self.logTree.topLevelItem(row).data( + 0, self.__incomingRole): + incomingCount += 1 + else: + break + localCount = self.logTree.topLevelItemCount() - incomingCount + else: + localCount = self.logTree.topLevelItemCount() + self.__bundleAct.setEnabled(localCount > 0) self.__unbundleAct.setEnabled(False) self.__gpgSignAct.setEnabled( @@ -1553,20 +1646,17 @@ self.__pullAct.setText(self.tr("Pull Selected Changes")) self.__fetchAct.setText(self.tr("Fetch Selected Changes")) if self.vcs.canPull() and not bool(self.__bundle): - # step 1: determine number of selected draft changesets - # i.e. those that can be pulled - selectedDraftItemsCount = 0 - for itm in self.logTree.selectedItems(): - phase = itm.text(self.PhaseColumn) - if phase == self.phases["draft"]: - selectedDraftItemsCount += 1 - self.__pullAct.setEnabled(selectedDraftItemsCount > 0) + selectedIncomingItemsCount = len([ + itm for itm in self.logTree.selectedItems() + if itm.data(0, self.__incomingRole) + ]) + self.__pullAct.setEnabled(selectedIncomingItemsCount > 0) self.__lfPullAct.setEnabled( self.vcs.isExtensionActive("largefiles") and selectedItemsCount > 0) self.__fetchAct.setEnabled( self.vcs.isExtensionActive("fetch") and - selectedDraftItemsCount > 0) + selectedIncomingItemsCount > 0) else: self.__pullAct.setEnabled(False) self.__lfPullAct.setEnabled(False) @@ -1789,8 +1879,11 @@ """ Private slot to handle the Next button. """ - if self.__lastRev > 0 and self.nextButton.isEnabled(): - self.__getLogEntries(startRev=self.__lastRev - 1) + if self.nextButton.isEnabled(): + if self.__lastRev > 0: + self.__getLogEntries(startRev=self.__lastRev - 1) + else: + self.__getLogEntries() @pyqtSlot(QDate) def on_fromDate_dateChanged(self, date): @@ -1921,6 +2014,9 @@ fieldIndex = self.__changesRole searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) indexIsRole = True + elif txt == "phase": + fieldIndex = self.PhaseColumn + searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) else: fieldIndex = self.__messageRole searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) @@ -1941,9 +2037,13 @@ self.limitSpinBox.setEnabled(True) @pyqtSlot() - def on_refreshButton_clicked(self): + def on_refreshButton_clicked(self, addNext=False): """ Private slot to refresh the log. + + @param addNext flag indicating to get a second batch of log entries as + well + @type bool """ self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True) @@ -1959,12 +2059,18 @@ if self.initialCommandMode in ("incoming", "outgoing"): self.nextButton.setEnabled(False) self.limitSpinBox.setEnabled(False) + if addNext: + self.__addFinishCallback(self.on_nextButton_clicked) else: self.nextButton.setEnabled(True) self.limitSpinBox.setEnabled(True) - self.commandMode = self.initialCommandMode - self.start(self.__filename, isFile=self.__isFile, + if self.initialCommandMode == "full_log": + self.commandMode = "incoming" + self.__addFinishCallback(self.on_nextButton_clicked) + else: + self.commandMode = self.initialCommandMode + self.start(self.__filename, bundle=self.__bundle, isFile=self.__isFile, noEntries=self.logTree.topLevelItemCount()) def on_passwordCheckBox_toggled(self, isOn): @@ -2022,27 +2128,29 @@ """ Private slot to handle the Change Phase action. """ - currentPhase = self.logTree.selectedItems()[0].text(self.PhaseColumn) - revs = [] - for itm in self.logTree.selectedItems(): - if itm.text(self.PhaseColumn) == currentPhase: - revs.append( - itm.text(self.RevisionColumn).split(":")[0].strip()) - - if not revs: - self.__phaseAct.setEnabled(False) - return - - if currentPhase == self.phases["draft"]: - newPhase = self.phases["secret"] - data = (revs, "s", True) - else: - newPhase = self.phases["draft"] - data = (revs, "d", False) - res = self.vcs.hgPhase(self.repodir, data) - if res: + itm = self.logTree.selectedItems()[0] + if not itm.data(0, self.__incomingRole): + currentPhase = itm.text(self.PhaseColumn) + revs = [] for itm in self.logTree.selectedItems(): - itm.setText(self.PhaseColumn, newPhase) + if itm.text(self.PhaseColumn) == currentPhase: + revs.append( + itm.text(self.RevisionColumn).split(":")[0].strip()) + + if not revs: + self.__phaseAct.setEnabled(False) + return + + if currentPhase == self.phases["draft"]: + newPhase = self.phases["secret"] + data = (revs, "s", True) + else: + newPhase = self.phases["draft"] + data = (revs, "d", False) + res = self.vcs.hgPhase(self.repodir, data) + if res: + for itm in self.logTree.selectedItems(): + itm.setText(self.PhaseColumn, newPhase) @pyqtSlot() def __graftActTriggered(self): @@ -2051,7 +2159,8 @@ """ revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: branch = itm.text(self.BranchColumn) if branch != self.__projectBranch: revs.append( @@ -2077,7 +2186,8 @@ """ Private slot to tag the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] tag = itm.text(self.TagsColumn).strip().split(", ", 1)[0] @@ -2091,7 +2201,8 @@ Private slot to switch the working directory to the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] bookmarks = [bm.strip() for bm in @@ -2129,7 +2240,8 @@ """ Private slot to bookmark the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev, changeset = \ itm.text(self.RevisionColumn).strip().split(":", 1) @@ -2150,7 +2262,8 @@ """ Private slot to move a bookmark to the selected revision. """ - if len(self.logTree.selectedItems()) == 1: + if len([itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)]) == 1: itm = self.logTree.selectedItems()[0] rev, changeset = \ itm.text(self.RevisionColumn).strip().split(":", 1) @@ -2174,7 +2287,8 @@ Private slot to pull large files of selected revisions. """ revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] if rev: revs.append(rev) @@ -2190,22 +2304,20 @@ """ shouldReopen = False refresh = False + addNext = False - if self.initialCommandMode == "log": - shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch( - self.repodir) - refresh = True - elif self.initialCommandMode == "incoming": + if self.initialCommandMode in ("log", "full_log", "incoming"): revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).split(":")[1].strip() - phase = itm.text(self.PhaseColumn).strip() - if rev and phase == self.phases["draft"]: + if rev: revs.append(rev) - if revs: - shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch( - self.repodir, ) - refresh = True + shouldReopen = self.vcs.getExtensionObject("fetch").hgFetch( + self.repodir, revisions=revs) + refresh = True + if self.initialCommandMode == "incoming": + addNext = True if shouldReopen: res = E5MessageBox.yesNo( None, @@ -2218,7 +2330,7 @@ return if refresh: - self.on_refreshButton_clicked() + self.on_refreshButton_clicked(addNext=addNext) @pyqtSlot() def __pullActTriggered(self): @@ -2227,20 +2339,19 @@ """ shouldReopen = False refresh = False + addNext = False - if self.initialCommandMode == "log": - shouldReopen = self.vcs.hgPull(self.repodir) - refresh = True - elif self.initialCommandMode == "incoming": + if self.initialCommandMode in ("log", "full_log", "incoming"): revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).split(":")[1].strip() - phase = itm.text(self.PhaseColumn).strip() - if rev and phase == self.phases["draft"]: + if rev: revs.append(rev) - if revs: - shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs) - refresh = True + shouldReopen = self.vcs.hgPull(self.repodir, revisions=revs) + refresh = True + if self.initialCommandMode == "incoming": + addNext = True if shouldReopen: res = E5MessageBox.yesNo( @@ -2254,7 +2365,7 @@ return if refresh: - self.on_refreshButton_clicked() + self.on_refreshButton_clicked(addNext=addNext) @pyqtSlot() def __pushActTriggered(self): @@ -2263,10 +2374,12 @@ changeset. """ itm = self.logTree.selectedItems()[0] - rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] - if rev: - self.vcs.hgPush(self.repodir, rev=rev) - self.on_refreshButton_clicked() + if not itm.data(0, self.__incomingRole): + rev = itm.text(self.RevisionColumn).strip().split(":", 1)[0] + if rev: + self.vcs.hgPush(self.repodir, rev=rev) + self.on_refreshButton_clicked( + addNext=self.initialCommandMode == "outgoing") @pyqtSlot() def __pushAllActTriggered(self): @@ -2282,20 +2395,21 @@ Private slot to strip changesets from the repository. """ itm = self.logTree.selectedItems()[0] - rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1] - shouldReopen = self.vcs.getExtensionObject("strip").hgStrip( - self.repodir, rev=rev) - if shouldReopen: - res = E5MessageBox.yesNo( - None, - self.tr("Strip Changesets"), - self.tr( - """The project should be reread. Do this now?"""), - yesDefault=True) - if res: - e5App().getObject("Project").reopenProject() - return - + if not itm.data(0, self.__incomingRole): + rev = itm.text(self.RevisionColumn).strip().split(":", 1)[1] + shouldReopen = self.vcs.getExtensionObject("strip").hgStrip( + self.repodir, rev=rev) + if shouldReopen: + res = E5MessageBox.yesNo( + None, + self.tr("Strip Changesets"), + self.tr( + """The project should be reread. Do this now?"""), + yesDefault=True) + if res: + e5App().getObject("Project").reopenProject() + return + self.on_refreshButton_clicked() @pyqtSlot() @@ -2305,17 +2419,19 @@ changeset. """ itm = self.logTree.selectedItems()[0] - rev = "rev({0})".format( - itm.text(self.RevisionColumn).strip().split(":", 1)[0]) - self.vcs.vcsMerge(self.repodir, rev=rev) + if not itm.data(0, self.__incomingRole): + rev = "rev({0})".format( + itm.text(self.RevisionColumn).strip().split(":", 1)[0]) + self.vcs.vcsMerge(self.repodir, rev=rev) @pyqtSlot() def __bundleActTriggered(self): """ Private slot to create a changegroup file. """ - if self.initialCommandMode == "log": - selectedItems = self.logTree.selectedItems() + if self.initialCommandMode in ("log", "full_log"): + selectedItems = [itm for itm in self.logTree.selectedItems() + if not itm.data(0, self.__incomingRole)] if len(selectedItems) == 0: # all revisions of the local repository will be bundled bundleData = { @@ -2394,7 +2510,8 @@ Private slot to sign the selected revisions. """ revs = [] - for itm in self.logTree.selectedItems(): + for itm in [item for item in self.logTree.selectedItems() + if not item.data(0, self.__incomingRole)]: rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() if rev: revs.append(rev) @@ -2408,11 +2525,12 @@ """ Private slot to verify the signatures of a selected revisions. """ - rev = self.logTree.selectedItems()[0].text(self.RevisionColumn)\ - .split(":", 1)[0].strip() - if rev: - self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures( - self.repodir, rev=rev) + itm = self.logTree.selectedItems()[0] + if not itm.data(0, self.__incomingRole): + rev = itm.text(self.RevisionColumn).split(":", 1)[0].strip() + if rev: + self.vcs.getExtensionObject("gpg").hgGpgVerifySignatures( + self.repodir, rev=rev) def __selectAllActTriggered(self, select=True): """