12 import os |
12 import os |
13 |
13 |
14 import pysvn |
14 import pysvn |
15 |
15 |
16 from PyQt4.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot |
16 from PyQt4.QtCore import QMutexLocker, QDate, QRegExp, Qt, pyqtSlot |
17 from PyQt4.QtGui import QCursor, QHeaderView, QDialog, QApplication, QDialogButtonBox, \ |
17 from PyQt4.QtGui import QCursor, QHeaderView, QDialog, QApplication, \ |
18 QTreeWidgetItem |
18 QDialogButtonBox, QTreeWidgetItem |
19 |
19 |
20 from E5Gui import E5MessageBox |
20 from E5Gui import E5MessageBox |
21 |
21 |
22 from .SvnUtilities import formatTime, dateFromTime_t |
22 from .SvnUtilities import formatTime, dateFromTime_t |
23 from .SvnDialogMixin import SvnDialogMixin |
23 from .SvnDialogMixin import SvnDialogMixin |
58 |
58 |
59 self.fromDate.setDisplayFormat("yyyy-MM-dd") |
59 self.fromDate.setDisplayFormat("yyyy-MM-dd") |
60 self.toDate.setDisplayFormat("yyyy-MM-dd") |
60 self.toDate.setDisplayFormat("yyyy-MM-dd") |
61 self.fromDate.setDate(QDate.currentDate()) |
61 self.fromDate.setDate(QDate.currentDate()) |
62 self.toDate.setDate(QDate.currentDate()) |
62 self.toDate.setDate(QDate.currentDate()) |
63 self.fieldCombo.setCurrentIndex(self.fieldCombo.findText(self.trUtf8("Message"))) |
63 self.fieldCombo.setCurrentIndex( |
64 self.limitSpinBox.setValue(self.vcs.getPlugin().getPreferences("LogLimit")) |
64 self.fieldCombo.findText(self.trUtf8("Message"))) |
65 self.stopCheckBox.setChecked(self.vcs.getPlugin().getPreferences("StopLogOnCopy")) |
65 self.limitSpinBox.setValue( |
|
66 self.vcs.getPlugin().getPreferences("LogLimit")) |
|
67 self.stopCheckBox.setChecked( |
|
68 self.vcs.getPlugin().getPreferences("StopLogOnCopy")) |
66 |
69 |
67 self.__messageRole = Qt.UserRole |
70 self.__messageRole = Qt.UserRole |
68 self.__changesRole = Qt.UserRole + 1 |
71 self.__changesRole = Qt.UserRole + 1 |
69 |
72 |
70 self.flags = { |
73 self.flags = { |
165 else: |
168 else: |
166 copyPath = changedPath["copyfrom_path"] |
169 copyPath = changedPath["copyfrom_path"] |
167 if changedPath["copyfrom_revision"] is None: |
170 if changedPath["copyfrom_revision"] is None: |
168 copyRev = "" |
171 copyRev = "" |
169 else: |
172 else: |
170 copyRev = "{0:7d}".format(changedPath["copyfrom_revision"].number) |
173 copyRev = "{0:7d}".format( |
|
174 changedPath["copyfrom_revision"].number) |
171 change = { |
175 change = { |
172 "action": changedPath["action"], |
176 "action": changedPath["action"], |
173 "path": changedPath["path"], |
177 "path": changedPath["path"], |
174 "copyfrom_path": copyPath, |
178 "copyfrom_path": copyPath, |
175 "copyfrom_revision": copyRev, |
179 "copyfrom_revision": copyRev, |
219 limit = self.limitSpinBox.value() |
223 limit = self.limitSpinBox.value() |
220 if startRev is None: |
224 if startRev is None: |
221 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
225 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
222 else: |
226 else: |
223 try: |
227 try: |
224 start = pysvn.Revision(pysvn.opt_revision_kind.number, int(startRev)) |
228 start = pysvn.Revision(pysvn.opt_revision_kind.number, |
|
229 int(startRev)) |
225 except TypeError: |
230 except TypeError: |
226 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
231 start = pysvn.Revision(pysvn.opt_revision_kind.head) |
227 |
232 |
228 locker = QMutexLocker(self.vcs.vcsExecutionMutex) |
233 locker = QMutexLocker(self.vcs.vcsExecutionMutex) |
229 cwd = os.getcwd() |
234 cwd = os.getcwd() |
255 |
260 |
256 for log in logs: |
261 for log in logs: |
257 self.__generateLogItem(log["author"], log["date"], |
262 self.__generateLogItem(log["author"], log["date"], |
258 log["message"], log["revision"], log['changed_paths']) |
263 log["message"], log["revision"], log['changed_paths']) |
259 dt = dateFromTime_t(log["date"]) |
264 dt = dateFromTime_t(log["date"]) |
260 if not self.__maxDate.isValid() and not self.__minDate.isValid(): |
265 if not self.__maxDate.isValid() and \ |
|
266 not self.__minDate.isValid(): |
261 self.__maxDate = dt |
267 self.__maxDate = dt |
262 self.__minDate = dt |
268 self.__minDate = dt |
263 else: |
269 else: |
264 if self.__maxDate < dt: |
270 if self.__maxDate < dt: |
265 self.__maxDate = dt |
271 self.__maxDate = dt |
321 @param rev1 first revision number (integer) |
327 @param rev1 first revision number (integer) |
322 @param rev2 second revision number (integer) |
328 @param rev2 second revision number (integer) |
323 @param peg_rev revision number to use as a reference (integer) |
329 @param peg_rev revision number to use as a reference (integer) |
324 """ |
330 """ |
325 if self.sbsCheckBox.isEnabled() and self.sbsCheckBox.isChecked(): |
331 if self.sbsCheckBox.isEnabled() and self.sbsCheckBox.isChecked(): |
326 self.vcs.svnSbsDiff(self.filename, revisions=(str(rev1), str(rev2))) |
332 self.vcs.svnSbsDiff(self.filename, |
|
333 revisions=(str(rev1), str(rev2))) |
327 else: |
334 else: |
328 if self.diff is None: |
335 if self.diff is None: |
329 from .SvnDiffDialog import SvnDiffDialog |
336 from .SvnDiffDialog import SvnDiffDialog |
330 self.diff = SvnDiffDialog(self.vcs) |
337 self.diff = SvnDiffDialog(self.vcs) |
331 self.diff.show() |
338 self.diff.show() |
363 change["copyfrom_path"], change["copyfrom_revision"]) |
370 change["copyfrom_path"], change["copyfrom_revision"]) |
364 self.__resizeColumnsFiles() |
371 self.__resizeColumnsFiles() |
365 self.__resortFiles() |
372 self.__resortFiles() |
366 |
373 |
367 self.diffPreviousButton.setEnabled( |
374 self.diffPreviousButton.setEnabled( |
368 current != self.logTree.topLevelItem(self.logTree.topLevelItemCount() - 1)) |
375 current != self.logTree.topLevelItem( |
|
376 self.logTree.topLevelItemCount() - 1)) |
369 |
377 |
370 @pyqtSlot() |
378 @pyqtSlot() |
371 def on_logTree_itemSelectionChanged(self): |
379 def on_logTree_itemSelectionChanged(self): |
372 """ |
380 """ |
373 Private slot called, when the selection has changed. |
381 Private slot called, when the selection has changed. |
374 """ |
382 """ |
375 self.diffRevisionsButton.setEnabled(len(self.logTree.selectedItems()) == 2) |
383 self.diffRevisionsButton.setEnabled( |
|
384 len(self.logTree.selectedItems()) == 2) |
376 |
385 |
377 @pyqtSlot() |
386 @pyqtSlot() |
378 def on_nextButton_clicked(self): |
387 def on_nextButton_clicked(self): |
379 """ |
388 """ |
380 Private slot to handle the Next button. |
389 Private slot to handle the Next button. |
397 if itm is None: |
406 if itm is None: |
398 self.diffPreviousButton.setEnabled(False) |
407 self.diffPreviousButton.setEnabled(False) |
399 return |
408 return |
400 rev2 = int(itm.text(0)) |
409 rev2 = int(itm.text(0)) |
401 |
410 |
402 itm = self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) + 1) |
411 itm = self.logTree.topLevelItem( |
|
412 self.logTree.indexOfTopLevelItem(itm) + 1) |
403 if itm is None: |
413 if itm is None: |
404 self.diffPreviousButton.setEnabled(False) |
414 self.diffPreviousButton.setEnabled(False) |
405 return |
415 return |
406 rev1 = int(itm.text(0)) |
416 rev1 = int(itm.text(0)) |
407 |
417 |
487 searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) |
497 searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) |
488 elif txt == self.trUtf8("Revision"): |
498 elif txt == self.trUtf8("Revision"): |
489 fieldIndex = 0 |
499 fieldIndex = 0 |
490 txt = self.rxEdit.text() |
500 txt = self.rxEdit.text() |
491 if txt.startswith("^"): |
501 if txt.startswith("^"): |
492 searchRx = QRegExp("^\s*{0}".format(txt[1:]), Qt.CaseInsensitive) |
502 searchRx = QRegExp( |
|
503 "^\s*{0}".format(txt[1:]), Qt.CaseInsensitive) |
493 else: |
504 else: |
494 searchRx = QRegExp(txt, Qt.CaseInsensitive) |
505 searchRx = QRegExp(txt, Qt.CaseInsensitive) |
495 else: |
506 else: |
496 fieldIndex = 3 |
507 fieldIndex = 3 |
497 searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) |
508 searchRx = QRegExp(self.rxEdit.text(), Qt.CaseInsensitive) |
511 self.filesTree.clear() |
522 self.filesTree.clear() |
512 |
523 |
513 @pyqtSlot(bool) |
524 @pyqtSlot(bool) |
514 def on_stopCheckBox_clicked(self, checked): |
525 def on_stopCheckBox_clicked(self, checked): |
515 """ |
526 """ |
516 Private slot called, when the stop on copy/move checkbox is clicked |
527 Private slot called, when the stop on copy/move checkbox is clicked. |
|
528 |
|
529 @param checked flag indicating the check box state (boolean) |
517 """ |
530 """ |
518 self.vcs.getPlugin().setPreferences("StopLogOnCopy", |
531 self.vcs.getPlugin().setPreferences("StopLogOnCopy", |
519 int(self.stopCheckBox.isChecked())) |
532 int(self.stopCheckBox.isChecked())) |
520 self.nextButton.setEnabled(True) |
533 self.nextButton.setEnabled(True) |
521 self.limitSpinBox.setEnabled(True) |
534 self.limitSpinBox.setEnabled(True) |