55 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "") |
55 self.filesTree.headerItem().setText(self.filesTree.columnCount(), "") |
56 self.filesTree.header().setSortIndicator(0, Qt.AscendingOrder) |
56 self.filesTree.header().setSortIndicator(0, Qt.AscendingOrder) |
57 |
57 |
58 self.vcs = vcs |
58 self.vcs = vcs |
59 if mode in ("log", "incoming", "outgoing"): |
59 if mode in ("log", "incoming", "outgoing"): |
60 self.mode = mode |
60 self.commandMode = mode |
61 else: |
61 else: |
62 self.mode = "log" |
62 self.commandMode = "log" |
63 |
63 |
64 self.__maxDate = QDate() |
64 self.__maxDate = QDate() |
65 self.__minDate = QDate() |
65 self.__minDate = QDate() |
66 self.__filterLogsEnabled = True |
66 self.__filterLogsEnabled = True |
67 |
67 |
203 self.__revColors[p] = self.__revColor |
204 self.__revColors[p] = self.__revColor |
204 self.__revColor += 1 |
205 self.__revColor += 1 |
205 |
206 |
206 # add edges to the graph |
207 # add edges to the graph |
207 edges = [] |
208 edges = [] |
208 if rev: |
209 ## if rev and parents[0] != -1: |
|
210 if parents[0] != -1: |
209 for ecol, erev in enumerate(self.__revs): |
211 for ecol, erev in enumerate(self.__revs): |
210 if erev in next: |
212 if erev in next: |
211 edges.append((ecol, next.index(erev), self.__revColors[erev])) |
213 edges.append((ecol, next.index(erev), self.__revColors[erev])) |
212 elif erev == rev: |
214 elif erev == rev: |
213 for p in parents: |
215 for p in parents: |
275 pen.setWidth(penradius) |
277 pen.setWidth(penradius) |
276 painter.setPen(pen) |
278 painter.setPen(pen) |
277 painter.drawEllipse(dot_x, dot_y, radius, radius) |
279 painter.drawEllipse(dot_x, dot_y, radius, radius) |
278 painter.end() |
280 painter.end() |
279 return QIcon(pix) |
281 return QIcon(pix) |
|
282 |
|
283 def __getParents(self, rev): |
|
284 """ |
|
285 Private method to get the parents of the currently viewed file/directory. |
|
286 |
|
287 @param rev revision number to get parents for (string) |
|
288 @return list of parent revisions (list of integers) |
|
289 """ |
|
290 errMsg = "" |
|
291 parents = [-1] |
|
292 |
|
293 process = QProcess() |
|
294 args = [] |
|
295 args.append("parents") |
|
296 args.append("--template") |
|
297 args.append("{rev}\n") |
|
298 args.append("-r") |
|
299 args.append(rev) |
|
300 args.append(self.filename) |
|
301 |
|
302 process.setWorkingDirectory(self.repodir) |
|
303 process.start('hg', args) |
|
304 procStarted = process.waitForStarted() |
|
305 if procStarted: |
|
306 finished = process.waitForFinished(30000) |
|
307 if finished and process.exitCode() == 0: |
|
308 output = \ |
|
309 str(process.readAllStandardOutput(), |
|
310 Preferences.getSystem("IOEncoding"), |
|
311 'replace') |
|
312 parents = [int(p) for p in output.strip().splitlines()] |
|
313 else: |
|
314 if not finished: |
|
315 errMsg = self.trUtf8("The hg process did not finish within 30s.") |
|
316 else: |
|
317 errMsg = self.trUtf8("Could not start the hg executable.") |
|
318 |
|
319 if errMsg: |
|
320 QMessageBox.critical(self, |
|
321 self.trUtf8("Mercurial Error"), |
|
322 errMsg) |
|
323 |
|
324 return parents |
280 |
325 |
281 def __generateLogItem(self, author, date, message, revision, changedPaths, parents, |
326 def __generateLogItem(self, author, date, message, revision, changedPaths, parents, |
282 branches, tags): |
327 branches, tags): |
283 """ |
328 """ |
284 Private method to generate a log tree entry. |
329 Private method to generate a log tree entry. |
313 ]) |
358 ]) |
314 |
359 |
315 itm.setForeground(self.BranchColumn, |
360 itm.setForeground(self.BranchColumn, |
316 QBrush(QColor(self.__branchColor(branches[0])))) |
361 QBrush(QColor(self.__branchColor(branches[0])))) |
317 |
362 |
|
363 if not self.projectMode: |
|
364 parents = self.__getParents(rev) |
318 column, color, edges = self.__generateEdges(int(rev), parents) |
365 column, color, edges = self.__generateEdges(int(rev), parents) |
319 |
366 |
320 itm.setData(0, self.__messageRole, message) |
367 itm.setData(0, self.__messageRole, message) |
321 itm.setData(0, self.__changesRole, changedPaths) |
368 itm.setData(0, self.__changesRole, changedPaths) |
322 itm.setData(0, self.__edgesRole, edges) |
369 itm.setData(0, self.__edgesRole, edges) |
323 |
370 |
324 if self.fname == "." and self.dname == self.repodir: |
371 if self.logTree.topLevelItemCount() > 1: |
325 if self.logTree.topLevelItemCount() > 1: |
372 topedges = \ |
326 topedges = \ |
373 self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) - 1)\ |
327 self.logTree.topLevelItem(self.logTree.indexOfTopLevelItem(itm) - 1)\ |
374 .data(0, self.__edgesRole) |
328 .data(0, self.__edgesRole) |
375 else: |
329 else: |
376 topedges = None |
330 topedges = None |
377 |
331 |
378 icon = self.__generateIcon(column, color, edges, topedges, |
332 icon = self.__generateIcon(column, color, edges, topedges, |
379 QColor(self.__branchColor(branches[0]))) |
333 QColor(self.__branchColor(branches[0]))) |
380 itm.setIcon(0, icon) |
334 itm.setIcon(0, icon) |
|
335 |
381 |
336 try: |
382 try: |
337 self.__lastRev = int(revision.split(":")[0]) |
383 self.__lastRev = int(revision.split(":")[0]) |
338 except ValueError: |
384 except ValueError: |
339 self.__lastRev = 0 |
385 self.__lastRev = 0 |
377 self.errors.clear() |
423 self.errors.clear() |
378 |
424 |
379 self.inputGroup.show() |
425 self.inputGroup.show() |
380 |
426 |
381 args = [] |
427 args = [] |
382 args.append(self.mode) |
428 args.append(self.commandMode) |
383 self.vcs.addArguments(args, self.vcs.options['global']) |
429 self.vcs.addArguments(args, self.vcs.options['global']) |
384 self.vcs.addArguments(args, self.vcs.options['log']) |
430 self.vcs.addArguments(args, self.vcs.options['log']) |
385 args.append('--verbose') |
431 args.append('--verbose') |
386 args.append('--limit') |
432 args.append('--limit') |
387 args.append(str(self.limitSpinBox.value())) |
433 args.append(str(self.limitSpinBox.value())) |
388 if self.mode in ("incoming", "outgoing"): |
434 if self.commandMode in ("incoming", "outgoing"): |
389 args.append("--newest-first") |
435 args.append("--newest-first") |
390 if startRev is not None: |
436 if startRev is not None: |
391 args.append('--rev') |
437 args.append('--rev') |
392 args.append('{0}:0'.format(startRev)) |
438 args.append('{0}:0'.format(startRev)) |
393 if not self.stopCheckBox.isChecked(): |
439 if not self.projectMode and \ |
|
440 not self.fname == "." and \ |
|
441 not self.stopCheckBox.isChecked(): |
394 args.append('--follow') |
442 args.append('--follow') |
395 args.append('--template') |
443 args.append('--template') |
396 args.append("change|{rev}:{node|short}\n" |
444 args.append("change|{rev}:{node|short}\n" |
397 "user|{author|email}\n" |
445 "user|{author|email}\n" |
398 "parents|{parents}\n" |
446 "parents|{parents}\n" |
402 "files_mods|{file_mods}\n" |
450 "files_mods|{file_mods}\n" |
403 "file_dels|{file_dels}\n" |
451 "file_dels|{file_dels}\n" |
404 "branches|{branches}\n" |
452 "branches|{branches}\n" |
405 "tags|{tags}\n" |
453 "tags|{tags}\n" |
406 "@@@\n") |
454 "@@@\n") |
407 if self.fname != "." or self.dname != self.repodir: |
455 if not self.projectMode: |
408 args.append(self.filename) |
456 args.append(self.filename) |
409 |
457 |
410 self.process.setWorkingDirectory(self.repodir) |
458 self.process.setWorkingDirectory(self.repodir) |
411 |
459 |
412 self.process.start('hg', args) |
460 self.process.start('hg', args) |
437 while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)): |
485 while not os.path.isdir(os.path.join(self.repodir, self.vcs.adminDir)): |
438 self.repodir = os.path.dirname(self.repodir) |
486 self.repodir = os.path.dirname(self.repodir) |
439 if self.repodir == os.sep: |
487 if self.repodir == os.sep: |
440 return |
488 return |
441 |
489 |
|
490 self.projectMode = (self.fname == "." and self.dname == self.repodir) |
|
491 self.stopCheckBox.setDisabled(self.projectMode or self.fname == ".") |
442 self.activateWindow() |
492 self.activateWindow() |
443 self.raise_() |
493 self.raise_() |
444 |
494 |
445 self.logTree.clear() |
495 self.logTree.clear() |
446 self.__started = True |
496 self.__started = True |