Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py

changeset 187
d7916a2e31d6
parent 185
f002e13c9aed
child 198
7ab8e126f404
equal deleted inserted replaced
186:655fda145529 187:d7916a2e31d6
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
94 94
95 self.buf = [] # buffer for stdout 95 self.buf = [] # buffer for stdout
96 self.diff = None 96 self.diff = None
97 self.__started = False 97 self.__started = False
98 self.__lastRev = 0 98 self.__lastRev = 0
99 self.projectMode = False
99 100
100 # attributes to store log graph data 101 # attributes to store log graph data
101 self.__revs = [] 102 self.__revs = []
102 self.__revColors = {} 103 self.__revColors = {}
103 self.__revColor = 0 104 self.__revColor = 0
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

eric ide

mercurial