12 import os |
12 import os |
13 |
13 |
14 import pysvn |
14 import pysvn |
15 |
15 |
16 from PyQt5.QtCore import QMutexLocker, QFileInfo, QDateTime, Qt, pyqtSlot |
16 from PyQt5.QtCore import QMutexLocker, QFileInfo, QDateTime, Qt, pyqtSlot |
17 from PyQt5.QtGui import QCursor, QTextCursor |
17 from PyQt5.QtGui import QTextCursor |
18 from PyQt5.QtWidgets import QWidget, QApplication, QDialogButtonBox |
18 from PyQt5.QtWidgets import QWidget, QDialogButtonBox |
19 |
19 |
20 from E5Gui.E5Application import e5App |
20 from E5Gui.E5Application import e5App |
21 from E5Gui import E5MessageBox, E5FileDialog |
21 from E5Gui import E5MessageBox, E5FileDialog |
|
22 from E5Gui.E5OverrideCursor import E5OverrideCursor |
22 |
23 |
23 from .SvnDialogMixin import SvnDialogMixin |
24 from .SvnDialogMixin import SvnDialogMixin |
24 from .Ui_SvnDiffDialog import Ui_SvnDiffDialog |
25 from .Ui_SvnDiffDialog import Ui_SvnDiffDialog |
25 from .SvnDiffHighlighter import SvnDiffHighlighter |
26 from .SvnDiffHighlighter import SvnDiffHighlighter |
26 |
27 |
198 dname, fnames = self.vcs.splitPathList(fn) |
197 dname, fnames = self.vcs.splitPathList(fn) |
199 else: |
198 else: |
200 dname, fname = self.vcs.splitPath(fn) |
199 dname, fname = self.vcs.splitPath(fn) |
201 fnames = [fname] |
200 fnames = [fname] |
202 |
201 |
203 locker = QMutexLocker(self.vcs.vcsExecutionMutex) |
202 with E5OverrideCursor(): |
204 cwd = os.getcwd() |
203 locker = QMutexLocker(self.vcs.vcsExecutionMutex) |
205 os.chdir(dname) |
204 cwd = os.getcwd() |
206 try: |
205 os.chdir(dname) |
207 dname = e5App().getObject('Project').getRelativePath(dname) |
206 try: |
208 if dname: |
207 dname = e5App().getObject('Project').getRelativePath(dname) |
209 dname += "/" |
208 if dname: |
210 for name in fnames: |
209 dname += "/" |
211 self.__showError( |
210 for name in fnames: |
212 self.tr("Processing file '{0}'...\n").format(name)) |
211 self.__showError( |
213 if urls is not None: |
212 self.tr("Processing file '{0}'...\n").format(name)) |
214 url1 = "{0}/{1}{2}".format(urls[0], dname, name) |
213 if urls is not None: |
215 url2 = "{0}/{1}{2}".format(urls[1], dname, name) |
214 url1 = "{0}/{1}{2}".format(urls[0], dname, name) |
216 if summary: |
215 url2 = "{0}/{1}{2}".format(urls[1], dname, name) |
217 diff_summary = self.client.diff_summarize( |
216 if summary: |
218 url1, revision1=rev1, |
217 diff_summary = self.client.diff_summarize( |
219 url_or_path2=url2, revision2=rev2, |
218 url1, revision1=rev1, |
220 recurse=recurse) |
219 url_or_path2=url2, revision2=rev2, |
221 diff_list = [] |
220 recurse=recurse) |
222 for diff_sum in diff_summary: |
221 diff_list = [] |
223 path = diff_sum['path'] |
222 for diff_sum in diff_summary: |
224 diff_list.append("{0} {1}".format( |
223 path = diff_sum['path'] |
225 self.__getDiffSummaryKind( |
224 diff_list.append("{0} {1}".format( |
226 diff_sum['summarize_kind']), |
225 self.__getDiffSummaryKind( |
227 path)) |
226 diff_sum['summarize_kind']), |
228 diffText = os.linesep.join(diff_list) |
227 path)) |
|
228 diffText = os.linesep.join(diff_list) |
|
229 else: |
|
230 diffText = self.client.diff( |
|
231 tmpdir, |
|
232 url1, revision1=rev1, |
|
233 url_or_path2=url2, revision2=rev2, |
|
234 recurse=recurse) |
229 else: |
235 else: |
230 diffText = self.client.diff( |
236 if pegRev is not None: |
231 tmpdir, |
237 diffText = self.client.diff_peg( |
232 url1, revision1=rev1, |
238 tmpdir, name, |
233 url_or_path2=url2, revision2=rev2, |
239 peg_revision=self.__getVersionArg(pegRev), |
234 recurse=recurse) |
240 revision_start=rev1, revision_end=rev2, |
235 else: |
241 recurse=recurse) |
236 if pegRev is not None: |
242 else: |
237 diffText = self.client.diff_peg( |
243 diffText = self.client.diff( |
238 tmpdir, name, |
244 tmpdir, name, |
239 peg_revision=self.__getVersionArg(pegRev), |
245 revision1=rev1, revision2=rev2, recurse=recurse) |
240 revision_start=rev1, revision_end=rev2, |
246 counter = 0 |
241 recurse=recurse) |
247 for line in diffText.splitlines(): |
242 else: |
248 if line.startswith("--- ") or line.startswith("+++ "): |
243 diffText = self.client.diff( |
249 self.__processFileLine(line) |
244 tmpdir, name, |
250 |
245 revision1=rev1, revision2=rev2, recurse=recurse) |
251 self.__appendText("{0}{1}".format(line, os.linesep)) |
246 counter = 0 |
252 counter += 1 |
247 for line in diffText.splitlines(): |
253 if counter == 30: |
248 if line.startswith("--- ") or line.startswith("+++ "): |
254 # check for cancel every 30 lines |
249 self.__processFileLine(line) |
255 counter = 0 |
250 |
256 if self._clientCancelCallback(): |
251 self.__appendText("{0}{1}".format(line, os.linesep)) |
257 break |
252 counter += 1 |
258 if self._clientCancelCallback(): |
253 if counter == 30: |
259 break |
254 # check for cancel every 30 lines |
260 except pysvn.ClientError as e: |
255 counter = 0 |
261 self.__showError(e.args[0]) |
256 if self._clientCancelCallback(): |
262 locker.unlock() |
257 break |
263 os.chdir(cwd) |
258 if self._clientCancelCallback(): |
|
259 break |
|
260 except pysvn.ClientError as e: |
|
261 self.__showError(e.args[0]) |
|
262 locker.unlock() |
|
263 os.chdir(cwd) |
|
264 self.__finish() |
264 self.__finish() |
265 |
265 |
266 if self.paras == 0: |
266 if self.paras == 0: |
267 self.contents.setPlainText(self.tr('There is no difference.')) |
267 self.contents.setPlainText(self.tr('There is no difference.')) |
268 |
268 |