11 import os |
11 import os |
12 |
12 |
13 import pysvn |
13 import pysvn |
14 |
14 |
15 from PyQt5.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot, QPoint |
15 from PyQt5.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot, QPoint |
16 from PyQt5.QtGui import QCursor |
|
17 from PyQt5.QtWidgets import ( |
16 from PyQt5.QtWidgets import ( |
18 QHeaderView, QWidget, QApplication, QDialogButtonBox, QTreeWidgetItem |
17 QHeaderView, QWidget, QApplication, QDialogButtonBox, QTreeWidgetItem |
19 ) |
18 ) |
20 |
19 |
21 from E5Gui import E5MessageBox |
20 from E5Gui import E5MessageBox |
|
21 from E5Gui.E5OverrideCursor import E5OverrideCursor |
22 |
22 |
23 from .SvnUtilities import formatTime, dateFromTime_t |
23 from .SvnUtilities import formatTime, dateFromTime_t |
24 from .SvnDialogMixin import SvnDialogMixin |
24 from .SvnDialogMixin import SvnDialogMixin |
25 |
25 |
26 from .Ui_SvnLogBrowserDialog import Ui_SvnLogBrowserDialog |
26 from .Ui_SvnLogBrowserDialog import Ui_SvnLogBrowserDialog |
262 @param startRev revision number to start from (integer, string) |
262 @param startRev revision number to start from (integer, string) |
263 """ |
263 """ |
264 fetchLimit = 10 |
264 fetchLimit = 10 |
265 self._reset() |
265 self._reset() |
266 |
266 |
267 QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) |
|
268 QApplication.processEvents() |
|
269 |
|
270 limit = self.limitSpinBox.value() |
267 limit = self.limitSpinBox.value() |
271 if startRev is None: |
268 if startRev is None: |
272 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
269 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
273 else: |
270 else: |
274 try: |
271 try: |
275 start = pysvn.Revision(pysvn.opt_revision_kind.number, |
272 start = pysvn.Revision(pysvn.opt_revision_kind.number, |
276 int(startRev)) |
273 int(startRev)) |
277 except TypeError: |
274 except TypeError: |
278 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
275 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
279 |
276 |
280 locker = QMutexLocker(self.vcs.vcsExecutionMutex) |
277 with E5OverrideCursor(): |
281 cwd = os.getcwd() |
278 locker = QMutexLocker(self.vcs.vcsExecutionMutex) |
282 os.chdir(self.dname) |
279 cwd = os.getcwd() |
283 try: |
280 os.chdir(self.dname) |
284 nextRev = 0 |
281 try: |
285 fetched = 0 |
282 nextRev = 0 |
286 logs = [] |
283 fetched = 0 |
287 while fetched < limit: |
284 logs = [] |
288 flimit = min(fetchLimit, limit - fetched) |
285 while fetched < limit: |
289 if fetched == 0: |
286 flimit = min(fetchLimit, limit - fetched) |
290 revstart = start |
287 if fetched == 0: |
291 else: |
288 revstart = start |
292 revstart = pysvn.Revision( |
289 else: |
293 pysvn.opt_revision_kind.number, nextRev) |
290 revstart = pysvn.Revision( |
294 allLogs = self.client.log( |
291 pysvn.opt_revision_kind.number, nextRev) |
295 self.fname, revision_start=revstart, |
292 allLogs = self.client.log( |
296 discover_changed_paths=True, limit=flimit + 1, |
293 self.fname, revision_start=revstart, |
297 strict_node_history=self.stopCheckBox.isChecked()) |
294 discover_changed_paths=True, limit=flimit + 1, |
298 if len(allLogs) <= flimit or self._clientCancelCallback(): |
295 strict_node_history=self.stopCheckBox.isChecked()) |
299 logs.extend(allLogs) |
296 if len(allLogs) <= flimit or self._clientCancelCallback(): |
300 break |
297 logs.extend(allLogs) |
301 else: |
298 break |
302 logs.extend(allLogs[:-1]) |
299 else: |
303 nextRev = allLogs[-1]["revision"].number |
300 logs.extend(allLogs[:-1]) |
304 fetched += fetchLimit |
301 nextRev = allLogs[-1]["revision"].number |
305 locker.unlock() |
302 fetched += fetchLimit |
306 |
303 locker.unlock() |
307 for log in logs: |
304 |
308 author = log["author"] |
305 for log in logs: |
309 message = log["message"] |
306 author = log["author"] |
310 self.__generateLogItem( |
307 message = log["message"] |
311 author, log["date"], message, |
308 self.__generateLogItem( |
312 log["revision"], log['changed_paths']) |
309 author, log["date"], message, |
313 dt = dateFromTime_t(log["date"]) |
310 log["revision"], log['changed_paths']) |
314 if ( |
311 dt = dateFromTime_t(log["date"]) |
315 not self.__maxDate.isValid() and |
312 if ( |
316 not self.__minDate.isValid() |
313 not self.__maxDate.isValid() and |
317 ): |
314 not self.__minDate.isValid() |
318 self.__maxDate = dt |
315 ): |
319 self.__minDate = dt |
|
320 else: |
|
321 if self.__maxDate < dt: |
|
322 self.__maxDate = dt |
316 self.__maxDate = dt |
323 if self.__minDate > dt: |
|
324 self.__minDate = dt |
317 self.__minDate = dt |
325 if len(logs) < limit and not self.cancelled: |
318 else: |
326 self.nextButton.setEnabled(False) |
319 if self.__maxDate < dt: |
327 self.limitSpinBox.setEnabled(False) |
320 self.__maxDate = dt |
328 self.__filterLogsEnabled = False |
321 if self.__minDate > dt: |
329 self.fromDate.setMinimumDate(self.__minDate) |
322 self.__minDate = dt |
330 self.fromDate.setMaximumDate(self.__maxDate) |
323 if len(logs) < limit and not self.cancelled: |
331 self.fromDate.setDate(self.__minDate) |
324 self.nextButton.setEnabled(False) |
332 self.toDate.setMinimumDate(self.__minDate) |
325 self.limitSpinBox.setEnabled(False) |
333 self.toDate.setMaximumDate(self.__maxDate) |
326 self.__filterLogsEnabled = False |
334 self.toDate.setDate(self.__maxDate) |
327 self.fromDate.setMinimumDate(self.__minDate) |
335 self.__filterLogsEnabled = True |
328 self.fromDate.setMaximumDate(self.__maxDate) |
336 |
329 self.fromDate.setDate(self.__minDate) |
337 self.__resizeColumnsLog() |
330 self.toDate.setMinimumDate(self.__minDate) |
338 self.__resortLog() |
331 self.toDate.setMaximumDate(self.__maxDate) |
339 self.__filterLogs() |
332 self.toDate.setDate(self.__maxDate) |
340 except pysvn.ClientError as e: |
333 self.__filterLogsEnabled = True |
341 locker.unlock() |
334 |
342 self.__showError(e.args[0]) |
335 self.__resizeColumnsLog() |
343 os.chdir(cwd) |
336 self.__resortLog() |
|
337 self.__filterLogs() |
|
338 except pysvn.ClientError as e: |
|
339 locker.unlock() |
|
340 self.__showError(e.args[0]) |
|
341 os.chdir(cwd) |
344 self.__finish() |
342 self.__finish() |
345 |
343 |
346 def start(self, fn, isFile=False): |
344 def start(self, fn, isFile=False): |
347 """ |
345 """ |
348 Public slot to start the svn log command. |
346 Public slot to start the svn log command. |