Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgLogCommand.java @ 511:122e0600799f
Respect multiple joins/forks in a history of a single file
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 14 Dec 2012 15:39:49 +0100 |
parents | 90093ee56c0d |
children | 5dcb4581c8ef |
comparison
equal
deleted
inserted
replaced
510:90093ee56c0d | 511:122e0600799f |
---|---|
22 import java.util.ArrayList; | 22 import java.util.ArrayList; |
23 import java.util.Arrays; | 23 import java.util.Arrays; |
24 import java.util.Calendar; | 24 import java.util.Calendar; |
25 import java.util.Collection; | 25 import java.util.Collection; |
26 import java.util.Collections; | 26 import java.util.Collections; |
27 import java.util.Comparator; | |
27 import java.util.ConcurrentModificationException; | 28 import java.util.ConcurrentModificationException; |
28 import java.util.Iterator; | 29 import java.util.Iterator; |
29 import java.util.LinkedList; | 30 import java.util.LinkedList; |
30 import java.util.List; | 31 import java.util.List; |
31 import java.util.ListIterator; | 32 import java.util.ListIterator; |
539 LinkedList<HistoryNode> queue = new LinkedList<HistoryNode>(); | 540 LinkedList<HistoryNode> queue = new LinkedList<HistoryNode>(); |
540 // look for ancestors of the selected history node | 541 // look for ancestors of the selected history node |
541 queue.add(completeHistory[lastRevisionIndex]); | 542 queue.add(completeHistory[lastRevisionIndex]); |
542 do { | 543 do { |
543 HistoryNode withFileChange = queue.removeFirst(); | 544 HistoryNode withFileChange = queue.removeFirst(); |
545 if (strippedHistoryList.contains(withFileChange)) { | |
546 // fork point for the change that was later merged (and we traced | |
547 // both lines of development by now. | |
548 continue; | |
549 } | |
544 if (withFileChange.children != null) { | 550 if (withFileChange.children != null) { |
545 withFileChange.children.retainAll(strippedHistoryList); | 551 withFileChange.children.retainAll(strippedHistoryList); |
546 } | 552 } |
547 strippedHistoryList.addFirst(withFileChange); | 553 strippedHistoryList.addFirst(withFileChange); |
548 if (withFileChange.parent1 != null) { | 554 if (withFileChange.parent1 != null) { |
550 } | 556 } |
551 if (withFileChange.parent2 != null) { | 557 if (withFileChange.parent2 != null) { |
552 queue.addLast(withFileChange.parent2); | 558 queue.addLast(withFileChange.parent2); |
553 } | 559 } |
554 } while (!queue.isEmpty()); | 560 } while (!queue.isEmpty()); |
561 Collections.sort(strippedHistoryList, new Comparator<HistoryNode>() { | |
562 | |
563 public int compare(HistoryNode o1, HistoryNode o2) { | |
564 return o1.changeset - o2.changeset; | |
565 } | |
566 }); | |
555 completeHistory = null; | 567 completeHistory = null; |
556 commitRevisions = null; | 568 commitRevisions = null; |
557 // collected values are no longer valid - shall | 569 // collected values are no longer valid - shall |
558 // strip off elements for missing HistoryNodes, but it's easier just to re-create the array | 570 // strip off elements for missing HistoryNodes, but it's easier just to re-create the array |
559 // from resultHistory later, once (and if) needed | 571 // from resultHistory later, once (and if) needed |
663 // for the last element in history empty children are by construction: | 675 // for the last element in history empty children are by construction: |
664 // we don't iterate further than last element of interest in TreeBuildInspector#go | 676 // we don't iterate further than last element of interest in TreeBuildInspector#go |
665 assert children == null || children.isEmpty(); | 677 assert children == null || children.isEmpty(); |
666 child.parent1 = this; | 678 child.parent1 = this; |
667 addChild(child); | 679 addChild(child); |
680 } | |
681 | |
682 public String toString() { | |
683 return String.format("<cset:%d, parents: %s, %s>", changeset, parent1 == null ? "-" : String.valueOf(parent1.changeset), parent2 == null ? "-" : String.valueOf(parent2.changeset)); | |
668 } | 684 } |
669 } | 685 } |
670 | 686 |
671 private class ElementImpl implements HgChangesetTreeHandler.TreeElement, HgChangelog.Inspector { | 687 private class ElementImpl implements HgChangesetTreeHandler.TreeElement, HgChangelog.Inspector { |
672 private HistoryNode historyNode; | 688 private HistoryNode historyNode; |