Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

changeset 187
d7916a2e31d6
parent 185
f002e13c9aed
child 198
7ab8e126f404
--- a/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Sun Apr 18 10:52:29 2010 +0000
+++ b/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py	Sun Apr 18 14:20:04 2010 +0000
@@ -57,9 +57,9 @@
         
         self.vcs = vcs
         if mode in ("log", "incoming", "outgoing"):
-            self.mode = mode
+            self.commandMode = mode
         else:
-            self.mode = "log"
+            self.commandMode = "log"
         
         self.__maxDate = QDate()
         self.__minDate = QDate()
@@ -96,6 +96,7 @@
         self.diff = None
         self.__started = False
         self.__lastRev = 0
+        self.projectMode = False
         
         # attributes to store log graph data
         self.__revs = []
@@ -205,7 +206,8 @@
         
         # add edges to the graph
         edges = []
-        if rev:
+##        if rev and parents[0] != -1:
+        if parents[0] != -1:
             for ecol, erev in enumerate(self.__revs):
                 if erev in next:
                     edges.append((ecol, next.index(erev), self.__revColors[erev]))
@@ -278,6 +280,49 @@
         painter.end()
         return QIcon(pix)
     
+    def __getParents(self, rev):
+        """
+        Private method to get the parents of the currently viewed file/directory.
+        
+        @param rev revision number to get parents for (string)
+        @return list of parent revisions (list of integers)
+        """
+        errMsg = ""
+        parents = [-1]
+        
+        process = QProcess()
+        args = []
+        args.append("parents")
+        args.append("--template")
+        args.append("{rev}\n")
+        args.append("-r")
+        args.append(rev)
+        args.append(self.filename)
+        
+        process.setWorkingDirectory(self.repodir)
+        process.start('hg', args)
+        procStarted = process.waitForStarted()
+        if procStarted:
+            finished = process.waitForFinished(30000)
+            if finished and process.exitCode() == 0:
+                output = \
+                    str(process.readAllStandardOutput(), 
+                        Preferences.getSystem("IOEncoding"), 
+                        'replace')
+                parents = [int(p) for p in output.strip().splitlines()]
+            else:
+                if not finished:
+                    errMsg = self.trUtf8("The hg process did not finish within 30s.")
+        else:
+            errMsg = self.trUtf8("Could not start the hg executable.")
+        
+        if errMsg:
+            QMessageBox.critical(self,
+                self.trUtf8("Mercurial Error"),
+                errMsg)
+        
+        return parents
+    
     def __generateLogItem(self, author, date, message, revision, changedPaths, parents, 
                           branches, tags):
         """
@@ -315,23 +360,24 @@
         itm.setForeground(self.BranchColumn, 
                           QBrush(QColor(self.__branchColor(branches[0]))))
         
+        if not self.projectMode:
+            parents = self.__getParents(rev)
         column, color, edges = self.__generateEdges(int(rev), parents)
         
         itm.setData(0, self.__messageRole, message)
         itm.setData(0, self.__changesRole, changedPaths)
         itm.setData(0, self.__edgesRole, edges)
         
-        if self.fname == "." and self.dname == self.repodir:
-            if self.logTree.topLevelItemCount() > 1:
-                topedges = \
-                    self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) - 1)\
-                    .data(0, self.__edgesRole)
-            else:
-                topedges = None
-            
-            icon = self.__generateIcon(column, color, edges, topedges, 
-                                       QColor(self.__branchColor(branches[0])))
-            itm.setIcon(0, icon)
+        if self.logTree.topLevelItemCount() > 1:
+            topedges = \
+                self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) - 1)\
+                .data(0, self.__edgesRole)
+        else:
+            topedges = None
+        
+        icon = self.__generateIcon(column, color, edges, topedges, 
+                                   QColor(self.__branchColor(branches[0])))
+        itm.setIcon(0, icon)
         
         try:
             self.__lastRev = int(revision.split(":")[0])
@@ -379,18 +425,20 @@
         self.inputGroup.show()
         
         args = []
-        args.append(self.mode)
+        args.append(self.commandMode)
         self.vcs.addArguments(args, self.vcs.options['global'])
         self.vcs.addArguments(args, self.vcs.options['log'])
         args.append('--verbose')
         args.append('--limit')
         args.append(str(self.limitSpinBox.value()))
-        if self.mode in ("incoming", "outgoing"):
+        if self.commandMode in ("incoming", "outgoing"):
             args.append("--newest-first")
         if startRev is not None:
             args.append('--rev')
             args.append('{0}:0'.format(startRev))
-        if not self.stopCheckBox.isChecked():
+        if not self.projectMode and \
+           not self.fname == "." and \
+           not self.stopCheckBox.isChecked():
             args.append('--follow')
         args.append('--template')
         args.append("change|{rev}:{node|short}\n"
@@ -404,7 +452,7 @@
                     "branches|{branches}\n"
                     "tags|{tags}\n"
                     "@@@\n")
-        if self.fname != "." or self.dname != self.repodir:
+        if not self.projectMode:
             args.append(self.filename)
         
         self.process.setWorkingDirectory(self.repodir)
@@ -439,6 +487,8 @@
             if self.repodir == os.sep:
                 return
         
+        self.projectMode = (self.fname == "." and self.dname == self.repodir)
+        self.stopCheckBox.setDisabled(self.projectMode or self.fname == ".")
         self.activateWindow()
         self.raise_()
         

eric ide

mercurial