Plugins/VcsPlugins/vcsMercurial/HgLogDialog.py

changeset 1246
5e9f6df3d1fc
parent 1131
7781e396c903
child 1256
885706dbb69f
--- a/Plugins/VcsPlugins/vcsMercurial/HgLogDialog.py	Mon Aug 29 20:08:40 2011 +0200
+++ b/Plugins/VcsPlugins/vcsMercurial/HgLogDialog.py	Mon Aug 29 20:09:27 2011 +0200
@@ -51,6 +51,7 @@
         else:
             self.mode = "log"
         self.bundle = bundle
+        self.__hgClient = self.vcs.getClient()
         
         self.contents.setHtml(
             self.trUtf8('<b>Processing your request, please wait...</b>'))
@@ -79,11 +80,14 @@
         
         @param e close event (QCloseEvent)
         """
-        if self.process is not None and \
-           self.process.state() != QProcess.NotRunning:
-            self.process.terminate()
-            QTimer.singleShot(2000, self.process.kill)
-            self.process.waitForFinished(3000)
+        if self.__hgClient:
+            self.__hgClient.cancel()
+        else:
+            if self.process is not None and \
+               self.process.state() != QProcess.NotRunning:
+                self.process.terminate()
+                QTimer.singleShot(2000, self.process.kill)
+                self.process.waitForFinished(3000)
         
         e.accept()
     
@@ -110,8 +114,6 @@
         
         self.projectMode = (self.fname == "." and self.dname == self.repodir)
         
-        self.process.kill()
-        
         self.activateWindow()
         self.raise_()
         
@@ -145,18 +147,35 @@
         if not self.projectMode:
             args.append(self.filename)
         
-        self.process.setWorkingDirectory(self.repodir)
-        
-        self.process.start('hg', args)
-        procStarted = self.process.waitForStarted()
-        if not procStarted:
+        if self.__hgClient:
             self.inputGroup.setEnabled(False)
-            E5MessageBox.critical(self,
-                self.trUtf8('Process Generation Error'),
-                self.trUtf8(
-                    'The process {0} could not be started. '
-                    'Ensure, that it is in the search path.'
-                ).format('hg'))
+            self.inputGroup.hide()
+            
+            out, err = self.__hgClient.runcommand(args)
+            
+            if out:
+                for line in out.splitlines(True):
+                    self.__processOutputLine(line)
+            
+            if err:
+                self.__showError(err)
+            
+            self.__finish()
+        else:
+            self.process.kill()
+            
+            self.process.setWorkingDirectory(self.repodir)
+            
+            self.process.start('hg', args)
+            procStarted = self.process.waitForStarted()
+            if not procStarted:
+                self.inputGroup.setEnabled(False)
+                E5MessageBox.critical(self,
+                    self.trUtf8('Process Generation Error'),
+                    self.trUtf8(
+                        'The process {0} could not be started. '
+                        'Ensure, that it is in the search path.'
+                    ).format('hg'))
     
     def __getParents(self, rev):
         """
@@ -168,7 +187,6 @@
         errMsg = ""
         parents = []
         
-        process = QProcess()
         args = []
         args.append("parents")
         if self.mode == "incoming":
@@ -185,28 +203,35 @@
         if not self.projectMode:
             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 = [p for p in output.strip().splitlines()]
+        output = ""
+        if self.__hgClient:
+            output, errMsg = self.__hgClient.runcommand(args)
+        else:
+            process = QProcess()
+            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')
+                else:
+                    if not finished:
+                        errMsg = self.trUtf8("The hg process did not finish within 30s.")
             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.")
+                errMsg = self.trUtf8("Could not start the hg executable.")
         
         if errMsg:
             E5MessageBox.critical(self,
                 self.trUtf8("Mercurial Error"),
                 errMsg)
         
+        if output:
+            parents = [p for p in output.strip().splitlines()]
+        
         return parents
     
     def __procFinished(self, exitCode, exitStatus):
@@ -216,6 +241,12 @@
         @param exitCode exit code of the process (integer)
         @param exitStatus exit status of the process (QProcess.ExitStatus)
         """
+        self.__finish()
+    
+    def __finish(self):
+        """
+        Private slot called when the process finished or the user pressed the button.
+        """
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         
@@ -324,30 +355,37 @@
             s = str(self.process.readLine(),
                         Preferences.getSystem("IOEncoding"),
                         'replace')
-            
-            if s == "@@@\n":
-                self.logEntries.append(self.lastLogEntry)
-                self.lastLogEntry = {}
-                self.fileCopies = {}
+            self.__processOutputLine(s)
+    
+    def __processOutputLine(self, line):
+        """
+        Private method to process the lines of output.
+        
+        @param line output line to be processed (string)
+        """
+        if line == "@@@\n":
+            self.logEntries.append(self.lastLogEntry)
+            self.lastLogEntry = {}
+            self.fileCopies = {}
+        else:
+            try:
+                key, value = line.split("|", 1)
+            except ValueError:
+                key = ""
+                value = line
+            if key == "change":
+                self.endInitialText = True
+            if key in ("change", "branches", "tags", "parents", "user",
+                        "date", "file_copies", "file_adds", "files_mods",
+                        "file_dels", "bookmarks"):
+                self.lastLogEntry[key] = value.strip()
+            elif key == "description":
+                self.lastLogEntry[key] = [value.strip()]
             else:
-                try:
-                    key, value = s.split("|", 1)
-                except ValueError:
-                    key = ""
-                    value = s
-                if key == "change":
-                    self.endInitialText = True
-                if key in ("change", "branches", "tags", "parents", "user",
-                            "date", "file_copies", "file_adds", "files_mods",
-                            "file_dels", "bookmarks"):
-                    self.lastLogEntry[key] = value.strip()
-                elif key == "description":
-                    self.lastLogEntry[key] = [value.strip()]
+                if self.endInitialText:
+                    self.lastLogEntry["description"].append(value.strip())
                 else:
-                    if self.endInitialText:
-                        self.lastLogEntry["description"].append(value.strip())
-                    else:
-                        self.initialText.append(value)
+                    self.initialText.append(value)
     
     def __readStderr(self):
         """
@@ -357,12 +395,20 @@
         error pane.
         """
         if self.process is not None:
-            self.errorGroup.show()
             s = str(self.process.readAllStandardError(),
                      Preferences.getSystem("IOEncoding"),
                      'replace')
-            self.errors.insertPlainText(s)
-            self.errors.ensureCursorVisible()
+            self.__showError(s)
+    
+    def __showError(self, out):
+        """
+        Private slot to show some error.
+        
+        @param out error to be shown (string)
+        """
+        self.errorGroup.show()
+        self.errors.insertPlainText(out)
+        self.errors.ensureCursorVisible()
     
     def __sourceChanged(self, url):
         """

eric ide

mercurial