Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/AnnotateFacility.java @ 546:cd78e8b9d7bc
File annotate test. Refactored FileAnnotation as standalone class, introduced LineInspector to make line offset calc code shared
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 18 Feb 2013 19:19:48 +0100 |
parents | 15b406c7cd9d |
children | ab21ac7dd833 |
comparison
equal
deleted
inserted
replaced
545:15b406c7cd9d | 546:cd78e8b9d7bc |
---|---|
33 public class AnnotateFacility { | 33 public class AnnotateFacility { |
34 | 34 |
35 /** | 35 /** |
36 * Annotates changes of the file against its parent(s) | 36 * Annotates changes of the file against its parent(s) |
37 */ | 37 */ |
38 public void annotateChange(HgDataFile df, int changesetRevisionIndex, Inspector insp) { | 38 public void annotateChange(HgDataFile df, int changesetRevisionIndex, BlockInspector insp) { |
39 // TODO detect if file is text/binary (e.g. looking for chars < ' ' and not \t\r\n\f | 39 // TODO detect if file is text/binary (e.g. looking for chars < ' ' and not \t\r\n\f |
40 Nodeid fileRev = df.getRepo().getManifest().getFileRevision(changesetRevisionIndex, df.getPath()); | 40 Nodeid fileRev = df.getRepo().getManifest().getFileRevision(changesetRevisionIndex, df.getPath()); |
41 int fileRevIndex = df.getRevisionIndex(fileRev); | 41 int fileRevIndex = df.getRevisionIndex(fileRev); |
42 int[] fileRevParents = new int[2]; | 42 int[] fileRevParents = new int[2]; |
43 df.parents(fileRevIndex, fileRevParents, null, null); | 43 df.parents(fileRevIndex, fileRevParents, null, null); |
74 throw ise; | 74 throw ise; |
75 } | 75 } |
76 } | 76 } |
77 | 77 |
78 @Callback | 78 @Callback |
79 public interface Inspector { | 79 public interface BlockInspector { |
80 void same(EqualBlock block); | 80 void same(EqualBlock block); |
81 void added(AddBlock block); | 81 void added(AddBlock block); |
82 void changed(ChangeBlock block); | 82 void changed(ChangeBlock block); |
83 void deleted(DeleteBlock block); | 83 void deleted(DeleteBlock block); |
84 } | 84 } |
85 | 85 |
86 @Callback | 86 @Callback |
87 public interface InspectorEx extends Inspector { // XXX better name | 87 public interface BlockInspectorEx extends BlockInspector { // XXX better name |
88 // XXX perhaps, shall pass object instead of separate values for future extension? | 88 // XXX perhaps, shall pass object instead of separate values for future extension? |
89 void start(int originLineCount, int targetLineCount); | 89 void start(int originLineCount, int targetLineCount); |
90 void done(); | 90 void done(); |
91 } | 91 } |
92 | 92 |
118 int totalRemovedLines(); | 118 int totalRemovedLines(); |
119 String[] removedLines(); | 119 String[] removedLines(); |
120 } | 120 } |
121 public interface ChangeBlock extends AddBlock, DeleteBlock { | 121 public interface ChangeBlock extends AddBlock, DeleteBlock { |
122 } | 122 } |
123 | |
124 @Callback | |
125 public interface LineInspector { | |
126 void line(int lineNumber, int changesetRevIndex, LineDescriptor ld); | |
127 } | |
128 | |
129 public interface LineDescriptor { | |
130 int totalLines(); | |
131 } | |
132 | |
133 | |
123 | 134 |
124 static class BlameBlockInspector extends PatchGenerator.DeltaInspector<LineSequence> { | 135 static class BlameBlockInspector extends PatchGenerator.DeltaInspector<LineSequence> { |
125 private final Inspector insp; | 136 private final BlockInspector insp; |
126 private final int csetP1; | 137 private final int csetP1; |
127 private final int csetTarget; | 138 private final int csetTarget; |
128 | 139 |
129 public BlameBlockInspector(Inspector inspector, int parentCset1, int targetCset) { | 140 public BlameBlockInspector(BlockInspector inspector, int parentCset1, int targetCset) { |
130 assert inspector != null; | 141 assert inspector != null; |
131 insp = inspector; | 142 insp = inspector; |
132 csetP1 = parentCset1; | 143 csetP1 = parentCset1; |
133 csetTarget = targetCset; | 144 csetTarget = targetCset; |
134 } | 145 } |
135 | 146 |
136 @Override | 147 @Override |
137 public void begin(LineSequence s1, LineSequence s2) { | 148 public void begin(LineSequence s1, LineSequence s2) { |
138 super.begin(s1, s2); | 149 super.begin(s1, s2); |
139 if (insp instanceof InspectorEx) { | 150 if (insp instanceof BlockInspectorEx) { |
140 ((InspectorEx) insp).start(s1.chunkCount() - 1, s2.chunkCount() - 1); | 151 ((BlockInspectorEx) insp).start(s1.chunkCount() - 1, s2.chunkCount() - 1); |
141 } | 152 } |
142 } | 153 } |
143 | 154 |
144 @Override | 155 @Override |
145 public void end() { | 156 public void end() { |
146 super.end(); | 157 super.end(); |
147 if(insp instanceof InspectorEx) { | 158 if(insp instanceof BlockInspectorEx) { |
148 ((InspectorEx) insp).done(); | 159 ((BlockInspectorEx) insp).done(); |
149 } | 160 } |
150 } | 161 } |
151 | 162 |
152 @Override | 163 @Override |
153 protected void changed(int s1From, int s1To, int s2From, int s2To) { | 164 protected void changed(int s1From, int s1To, int s2From, int s2To) { |