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) { | 
