diff -r a61ee61b1c2c -r 7e55c6268c35 Plugins/VcsPlugins/vcsSubversion/subversion.py --- 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)