Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

changeset 5459
cdfdecd2faef
parent 5451
8ee36e8a315f
child 5463
d84b854d59c0
--- a/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Mon Jan 30 19:49:23 2017 +0100
+++ b/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Mon Jan 30 19:53:08 2017 +0100
@@ -126,6 +126,9 @@
         self.__tagsTemplate = self.tr(
             "<tr><td><b>Tags</b></td><td>{0}</td></tr>"
         )
+        self.__latestTagTemplate = self.tr(
+            "<tr><td><b>Latest Tag</b></td><td>{0}</td></tr>"
+        )
         self.__bookmarksTemplate = self.tr(
             "<tr><td><b>Bookmarks</b></td><td>{0}</td></tr>"
         )
@@ -148,6 +151,7 @@
         self.__changesRole = Qt.UserRole + 1
         self.__edgesRole = Qt.UserRole + 2
         self.__parentsRole = Qt.UserRole + 3
+        self.__latestTagRole = Qt.UserRole + 4
         
         if self.__hgClient:
             self.process = None
@@ -700,8 +704,58 @@
                     self.__closedBranchesRevs.append(
                         parts[-2].split(":", 1)[0])
     
+    def __getRevisionOfTag(self, tag):
+        """
+        Private method to get the revision of a tag.
+        
+        @param tag tag name
+        @type str
+        @return tuple containing the revision and changeset ID
+        @rtype tuple of (str, str)
+        """
+        errMsg = ""
+        
+        args = self.vcs.initCommand("tags")
+        
+        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)
+        
+        res = ("", "")
+        if output:
+            for line in output.splitlines():
+                name, rev = line.strip().rsplit(None, 1)
+                if name == tag:
+                    res = tuple(rev.split(":", 1))
+                    break
+        
+        return res
+    
     def __generateLogItem(self, author, date, message, revision, changedPaths,
-                          parents, branches, tags, phase, bookmarks=None):
+                          parents, branches, tags, phase, bookmarks,
+                          latestTag):
         """
         Private method to generate a log tree entry.
         
@@ -716,6 +770,8 @@
         @param tags list of tags (string)
         @param phase phase of the entry (string)
         @param bookmarks list of bookmarks (string)
+        @param latestTag the latest tag(s) reachable from the changeset
+            (list of strings)
         @return reference to the generated item (QTreeWidgetItem)
         """
         logMessageColumnWidth = self.vcs.getPlugin().getPreferences(
@@ -765,6 +821,7 @@
         itm.setData(0, self.__messageRole, message)
         itm.setData(0, self.__changesRole, changedPaths)
         itm.setData(0, self.__edgesRole, edges)
+        itm.setData(0, self.__latestTagRole, latestTag)
         if parents == [-1]:
             itm.setData(0, self.__parentsRole, [])
         else:
@@ -1094,6 +1151,15 @@
                     log["bookmarks"] = value.strip().split(", ")
                 elif key == "phase":
                     log["phase"] = value.strip()
+                elif key == "latesttag":
+                    tag = value.strip()
+                    if tag == "null":
+                        log["latesttag"] = []
+                    elif ":" in tag:
+                        log["latesttag"] = [
+                            t.strip() for t in tag.split(":") if t.strip()]
+                    else:
+                        log["latesttag"] = [tag]
                 else:
                     if initialText:
                         continue
@@ -1105,7 +1171,7 @@
                         log["author"], log["date"],
                         log["message"], log["revision"], changedPaths,
                         log["parents"], log["branches"], log["tags"],
-                        log["phase"], log["bookmarks"])
+                        log["phase"], log["bookmarks"], log["latesttag"])
                     dt = QDate.fromString(log["date"], Qt.ISODate)
                     if not self.__maxDate.isValid() and \
                        not self.__minDate.isValid():
@@ -1364,6 +1430,20 @@
                     itm.text(self.BookmarksColumn))
             else:
                 bookmarksStr = ""
+            
+            if itm.data(0, self.__latestTagRole):
+                latestTagLinks = []
+                for tag in itm.data(0, self.__latestTagRole):
+                    url = QUrl()
+                    url.setScheme("rev")
+                    url.setPath(self.__getRevisionOfTag(tag)[0])
+                    latestTagLinks.append('<a href="{0}">{1}</a>'.format(
+                        url.toString(), tag))
+                latestTagStr = self.__latestTagTemplate.format(
+                    ", ".join(latestTagLinks))
+            else:
+                latestTagStr = ""
+            
             rev = int(itm.text(self.RevisionColumn).split(":", 1)[0])
             
             parentLinks = []
@@ -1390,7 +1470,7 @@
                     self.ClosedIndicator, ""),
                 ", ".join(parentLinks),
                 ", ".join(childLinks),
-                tagsStr + bookmarksStr,
+                tagsStr + latestTagStr + bookmarksStr,
             ))
             
             for line in itm.data(0, self.__messageRole):
@@ -1434,9 +1514,6 @@
         """
         Private slot called, when the selection has changed.
         """
-        if len(self.logTree.selectedItems()) == 1:
-            self.__updateGui(self.logTree.selectedItems()[0])
-        
         self.__updateDiffButtons()
         self.__updateToolMenuActions()
     

eric ide

mercurial