Mercurial > jhg
diff src/org/tmatesoft/hg/internal/ForwardAnnotateInspector.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 | 58a6900f845d |
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/internal/ForwardAnnotateInspector.java Thu Jul 18 18:03:51 2013 +0200 +++ b/src/org/tmatesoft/hg/internal/ForwardAnnotateInspector.java Thu Jul 18 18:47:45 2013 +0200 @@ -67,7 +67,7 @@ for (int i = 0, x = t.at(0); i < x; i++) { final int lineInRev = t.at(2) + i; final byte[] lc = revLines.get(lineInRev); - li.init(line++, t.at(1), lc); + li.init(line++, lineInRev+1, t.at(1), lc); insp.next(li); progress.worked(1); cancel.checkCancelled(); @@ -112,7 +112,7 @@ public void deleted(DeleteBlock block) throws HgCallbackTargetException { } - private void copyBlock(int originChangesetIndex, int originStart, int length) { + private void copyBlock(int originChangesetIndex, int blockStart, int length) { IntSliceSeq origin = all.get(originChangesetIndex); assert origin != null; // shall visit parents before came to this child int originPos = 0; @@ -120,17 +120,20 @@ for (IntTuple t : origin) { int originBlockLen = t.at(0); int originBlockEnd = originPos + originBlockLen; - if (originBlockEnd > originStart) { - int originBlockOverlap = Math.min(originBlockLen, originBlockEnd - originStart); + if (originBlockEnd > blockStart) { + // part of origin block from blockStart up to originBlockEnd, but not more + // than size of the block (when blockStart is out of block start, i.e. < originPos) + int originBlockOverlap = Math.min(originBlockLen, originBlockEnd - blockStart); assert originBlockOverlap > 0; - originBlockOverlap = Math.min(originBlockOverlap, targetBlockLen); + // eat as much as there's left in the block being copied + int originBlockConsumed = Math.min(originBlockOverlap, targetBlockLen); int originBlockLine = t.at(2); - if (originPos < originStart) { + if (originPos < blockStart) { originBlockLine += originBlockLen-originBlockOverlap; } // copy fragment of original block; - current.add(originBlockOverlap, t.at(1), originBlockLine); - targetBlockLen -= originBlockOverlap; + current.add(originBlockConsumed, t.at(1), originBlockLine); + targetBlockLen -= originBlockConsumed; if (targetBlockLen == 0) { break; } @@ -144,19 +147,17 @@ HgRepository repo = new HgLookup().detect("/home/artem/hg/junit-test-repos/test-annotate/"); HgDiffCommand cmd = new HgDiffCommand(repo); cmd.file(repo.getFileNode("file1")).order(HgIterateDirection.OldToNew); - cmd.range(0, 8); + final int cset = 8; + cmd.range(0, cset); final ForwardAnnotateInspector c2 = new ForwardAnnotateInspector(); cmd.executeAnnotate(c2); - for (IntTuple t : c2.all.get(8)) { - System.out.printf("Block %d lines from revision %d (starts with line %d in the origin)\n", t.at(0), t.at(1), t.at(2)); - } - for (IntTuple t : c2.all.get(8)) { + for (IntTuple t : c2.all.get(cset)) { System.out.printf("Block %d lines from revision %d (starts with line %d in the origin)\n", t.at(0), t.at(1), 1+t.at(2)); } - c2.report(8, new Inspector() { + c2.report(cset, new Inspector() { public void next(LineInfo lineInfo) throws HgCallbackTargetException { - System.out.printf("%3d:%3d: %s", lineInfo.getChangesetIndex(), lineInfo.getLineNumber(), new String(lineInfo.getContent())); + System.out.printf("%3d:%3d: %s", lineInfo.getChangesetIndex(), lineInfo.getOriginLineNumber(), new String(lineInfo.getContent())); } }, ProgressSupport.Factory.get(null), CancelSupport.Factory.get(null)); }