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