Plugins/VcsPlugins/vcsSubversion/subversion.py

changeset 2845
7e55c6268c35
parent 2842
8dfee488b176
child 2847
1843ef6e2656
child 2963
745d38097b7f
--- a/Plugins/VcsPlugins/vcsSubversion/subversion.py	Mon Aug 05 13:17:51 2013 +0200
+++ b/Plugins/VcsPlugins/vcsSubversion/subversion.py	Mon Aug 05 15:58:30 2013 +0200
@@ -89,6 +89,7 @@
         
         self.log = None
         self.diff = None
+        self.sbsDiff = None
         self.status = None
         self.propList = None
         self.tagbranchList = None
@@ -121,6 +122,8 @@
             self.log.close()
         if self.diff is not None:
             self.diff.close()
+        if self.sbsDiff is not None:
+            self.sbsDiff.close()
         if self.status is not None:
             self.status.close()
         if self.propList is not None:
@@ -831,6 +834,7 @@
         
         @param name file/directory name to show the log of (string)
         """
+        isFile = os.path.isfile(name)
         noEntries, ok = QInputDialog.getInt(
             None,
             self.trUtf8("Subversion Log"),
@@ -838,7 +842,7 @@
             self.getPlugin().getPreferences("LogLimit"), 1, 999999, 1)
         if ok:
             from .SvnLogDialog import SvnLogDialog
-            self.log = SvnLogDialog(self)
+            self.log = SvnLogDialog(self, isFile=isFile)
             self.log.show()
             self.log.start(name, noEntries)
         
@@ -1831,15 +1835,115 @@
             QApplication.processEvents()
             self.diff.start(name, urls=urls, summary=summary)
         
-    def svnLogBrowser(self, path):
+    def __svnGetFileForRevision(self, name, rev=""):
+        """
+        Private method to get a file for a specific revision from the repository.
+        
+        @param name file name to get from the repository (string)
+        @keyparam rev revision to retrieve (integer or string)
+        @return contents of the file (string) and an error message (string)
+        """
+        args = []
+        args.append("cat")
+        if rev:
+            args.append("--revision")
+            args.append(str(rev))
+        args.append(name)
+        
+        output = ""
+        error = ""
+        
+        process = QProcess()
+        process.start('svn', args)
+        procStarted = process.waitForStarted(5000)
+        if procStarted:
+            finished = process.waitForFinished(30000)
+            if finished:
+                if process.exitCode() == 0:
+                    output = str(process.readAllStandardOutput(),
+                        Preferences.getSystem("IOEncoding"), 'replace')
+                else:
+                    error = str(process.readAllStandardError(),
+                        Preferences.getSystem("IOEncoding"), 'replace')
+            else:
+                error = self.trUtf8("The svn process did not finish within 30s.")
+        else:
+            error = self.trUtf8('The process {0} could not be started. '
+                    'Ensure, that it is in the search path.').format('svn')
+        
+        return output, error
+    
+    def svnSbsDiff(self, name, extended=False, revisions=None):
+        """
+        Public method used to view the difference of a file to the Mercurial repository
+        side-by-side.
+        
+        @param name file name to be diffed (string)
+        @keyparam extended flag indicating the extended variant (boolean)
+        @keyparam revisions tuple of two revisions (tuple of strings)
+        """
+        if isinstance(name, list):
+            raise ValueError("Wrong parameter type")
+        
+        if extended:
+            from .SvnRevisionSelectionDialog import SvnRevisionSelectionDialog
+            dlg = SvnRevisionSelectionDialog()
+            if dlg.exec_() == QDialog.Accepted:
+                rev1, rev2 = dlg.getRevisions()
+                if rev1 == "WORKING":
+                    rev1 = ""
+                if rev2 == "WORKING":
+                    rev2 = ""
+        elif revisions:
+            rev1, rev2 = revisions[0], revisions[1]
+        else:
+            rev1, rev2 = "", ""
+        
+        output1, error = self.__svnGetFileForRevision(name, rev=rev1)
+        if error:
+            E5MessageBox.critical(self.__ui,
+                self.trUtf8("Subversion Side-by-Side Difference"),
+                error)
+            return
+        name1 = "{0} (rev. {1})".format(name, rev1 and rev1 or ".")
+        
+        if rev2:
+            output2, error = self.__svnGetFileForRevision(name, rev=rev2)
+            if error:
+                E5MessageBox.critical(self.__ui,
+                    self.trUtf8("Subversion Side-by-Side Difference"),
+                    error)
+                return
+            name2 = "{0} (rev. {1})".format(name, rev2)
+        else:
+            try:
+                f1 = open(name, "r", encoding="utf-8")
+                output2 = f1.read()
+                f1.close()
+                name2 = name
+            except IOError:
+                E5MessageBox.critical(self.__ui,
+                    self.trUtf8("Subversion Side-by-Side Difference"),
+                    self.trUtf8("""<p>The file <b>{0}</b> could not be read.</p>""")
+                        .format(name))
+                return
+        
+        if self.sbsDiff is None:
+            from UI.CompareDialog import CompareDialog
+            self.sbsDiff = CompareDialog()
+        self.sbsDiff.show()
+        self.sbsDiff.compare(output1, output2, name1, name2)
+    
+    def svnLogBrowser(self, path, isFile=False):
         """
         Public method used to browse the log of a file/directory from the
         Subversion repository.
         
         @param path file/directory name to show the log of (string)
+        @param isFile flag indicating log for a file is to be shown (boolean)
         """
         from .SvnLogBrowserDialog import SvnLogBrowserDialog
-        self.logBrowser = SvnLogBrowserDialog(self)
+        self.logBrowser = SvnLogBrowserDialog(self, isFile=isFile)
         self.logBrowser.show()
         self.logBrowser.start(path)
         

eric ide

mercurial