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