eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

changeset 7009
eaf5ed6ef298
parent 6986
23886c1dd3d0
child 7010
5d6f5a69a952
--- 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):
         """

eric ide

mercurial