comparison src/org/tmatesoft/hg/internal/ReverseAnnotateInspector.java @ 677:1c49c0cee540

Report line number at the first appearance, like 'hg annotate -l' does
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 18 Jul 2013 18:47:45 +0200
parents 3219cfadda49
children
comparison
equal deleted inserted replaced
676:3219cfadda49 677:1c49c0cee540
57 private IntMap<RangePairSeq> mergedRanges = new IntMap<RangePairSeq>(10); 57 private IntMap<RangePairSeq> mergedRanges = new IntMap<RangePairSeq>(10);
58 private IntMap<RangePairSeq> equalRanges = new IntMap<RangePairSeq>(10); 58 private IntMap<RangePairSeq> equalRanges = new IntMap<RangePairSeq>(10);
59 private boolean activeEqualsComesFromMerge = false; 59 private boolean activeEqualsComesFromMerge = false;
60 60
61 private int[] lineRevisions; 61 private int[] lineRevisions;
62 private int[] lineNumbers;
62 63
63 /** 64 /**
64 * @return desired order of iteration for diff 65 * @return desired order of iteration for diff
65 */ 66 */
66 public HgIterateDirection iterateDirection() { 67 public HgIterateDirection iterateDirection() {
70 public void report(int annotateRevIndex, HgAnnotateCommand.Inspector insp, ProgressSupport progress, CancelSupport cancel) throws HgCallbackTargetException, CancelledException { 71 public void report(int annotateRevIndex, HgAnnotateCommand.Inspector insp, ProgressSupport progress, CancelSupport cancel) throws HgCallbackTargetException, CancelledException {
71 LineImpl li = new LineImpl(); 72 LineImpl li = new LineImpl();
72 progress.start(lineRevisions.length); 73 progress.start(lineRevisions.length);
73 for (int i = 0; i < lineRevisions.length; i++) { 74 for (int i = 0; i < lineRevisions.length; i++) {
74 byte[] c = lineContent.elementAt(i).asArray(); 75 byte[] c = lineContent.elementAt(i).asArray();
75 li.init(i+1, lineRevisions[i], c); 76 li.init(i+1, lineNumbers[i] + 1, lineRevisions[i], c);
76 insp.next(li); 77 insp.next(li);
77 progress.worked(1); 78 progress.worked(1);
78 cancel.checkCancelled(); 79 cancel.checkCancelled();
79 } 80 }
80 progress.done(); 81 progress.done();
83 public void start(RevisionDescriptor rd) { 84 public void start(RevisionDescriptor rd) {
84 revisionDescriptor = rd; 85 revisionDescriptor = rd;
85 if (knownLines == null) { 86 if (knownLines == null) {
86 lineContent = rd.target(); 87 lineContent = rd.target();
87 knownLines = new boolean[lineContent.elementCount()]; 88 knownLines = new boolean[lineContent.elementCount()];
88 lineRevisions = new int [lineContent.elementCount()]; 89 lineRevisions = new int [knownLines.length];
89 Arrays.fill(lineRevisions, NO_REVISION); 90 Arrays.fill(lineRevisions, NO_REVISION);
91 lineNumbers = new int[knownLines.length];
90 activeEquals = new RangePairSeq(); 92 activeEquals = new RangePairSeq();
91 activeEquals.add(0, 0, knownLines.length); 93 activeEquals.add(0, 0, knownLines.length);
92 equalRanges.put(rd.targetChangesetIndex(), activeEquals); 94 equalRanges.put(rd.targetChangesetIndex(), activeEquals);
93 } else { 95 } else {
94 activeEquals = equalRanges.get(rd.targetChangesetIndex()); 96 activeEquals = equalRanges.get(rd.targetChangesetIndex());
142 int lnInFinal = activeEquals.mapLineIndex(ln); 144 int lnInFinal = activeEquals.mapLineIndex(ln);
143 if (lnInFinal != -1/* && !knownLines[lnInFinal]*/) { 145 if (lnInFinal != -1/* && !knownLines[lnInFinal]*/) {
144 if (rs != null) { 146 if (rs != null) {
145 rs.add(block.insertedAt() + i, lnInFinal, 1); 147 rs.add(block.insertedAt() + i, lnInFinal, 1);
146 } else { 148 } else {
147 line(lnInFinal, block.targetChangesetIndex()); 149 line(lnInFinal, ln, block.targetChangesetIndex());
148 } 150 }
149 knownLines[lnInFinal] = true; 151 knownLines[lnInFinal] = true;
150 } 152 }
151 } 153 }
152 } 154 }
156 } 158 }
157 159
158 public void deleted(DeleteBlock block) { 160 public void deleted(DeleteBlock block) {
159 } 161 }
160 162
161 private void line(int lineNumber, int changesetRevIndex) { 163 private void line(int lineNumber, int firstAppearance, int changesetRevIndex) {
162 lineRevisions[lineNumber] = changesetRevIndex; 164 lineRevisions[lineNumber] = changesetRevIndex;
165 lineNumbers[lineNumber] = firstAppearance;
163 } 166 }
164 } 167 }