Mercurial > hg4j
comparison test/org/tmatesoft/hg/test/TestBlame.java @ 603:707b5c7c6fa4
Refactor HgBlameFacility: relevant action methods moved to proper home (HgDataFile), as facility doesn't provide anything but packaging of relevant methods/interfaces
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Mon, 06 May 2013 18:29:57 +0200 |
| parents | e49f9d9513fa |
| children | 507602cb4fb3 |
comparison
equal
deleted
inserted
replaced
| 602:e3717fc7d26f | 603:707b5c7c6fa4 |
|---|---|
| 47 import org.tmatesoft.hg.core.HgRepoFacade; | 47 import org.tmatesoft.hg.core.HgRepoFacade; |
| 48 import org.tmatesoft.hg.internal.FileAnnotation; | 48 import org.tmatesoft.hg.internal.FileAnnotation; |
| 49 import org.tmatesoft.hg.internal.FileAnnotation.LineDescriptor; | 49 import org.tmatesoft.hg.internal.FileAnnotation.LineDescriptor; |
| 50 import org.tmatesoft.hg.internal.FileAnnotation.LineInspector; | 50 import org.tmatesoft.hg.internal.FileAnnotation.LineInspector; |
| 51 import org.tmatesoft.hg.internal.IntVector; | 51 import org.tmatesoft.hg.internal.IntVector; |
| 52 import org.tmatesoft.hg.repo.HgBlameFacility; | 52 import org.tmatesoft.hg.repo.HgBlameInspector; |
| 53 import org.tmatesoft.hg.repo.HgBlameFacility.AddBlock; | 53 import org.tmatesoft.hg.repo.HgBlameInspector.BlockData; |
| 54 import org.tmatesoft.hg.repo.HgBlameFacility.Block; | |
| 55 import org.tmatesoft.hg.repo.HgBlameFacility.BlockData; | |
| 56 import org.tmatesoft.hg.repo.HgBlameFacility.ChangeBlock; | |
| 57 import org.tmatesoft.hg.repo.HgBlameFacility.DeleteBlock; | |
| 58 import org.tmatesoft.hg.repo.HgBlameFacility.EqualBlock; | |
| 59 import org.tmatesoft.hg.repo.HgDataFile; | 54 import org.tmatesoft.hg.repo.HgDataFile; |
| 60 import org.tmatesoft.hg.repo.HgLookup; | 55 import org.tmatesoft.hg.repo.HgLookup; |
| 61 import org.tmatesoft.hg.repo.HgRepository; | 56 import org.tmatesoft.hg.repo.HgRepository; |
| 62 import org.tmatesoft.hg.util.Path; | 57 import org.tmatesoft.hg.util.Path; |
| 63 | 58 |
| 77 HgRepository repo = new HgLookup().detectFromWorkingDir(); | 72 HgRepository repo = new HgLookup().detectFromWorkingDir(); |
| 78 final String fname = "src/org/tmatesoft/hg/internal/PatchGenerator.java"; | 73 final String fname = "src/org/tmatesoft/hg/internal/PatchGenerator.java"; |
| 79 final int checkChangeset = 539; | 74 final int checkChangeset = 539; |
| 80 HgDataFile df = repo.getFileNode(fname); | 75 HgDataFile df = repo.getFileNode(fname); |
| 81 ByteArrayOutputStream bos = new ByteArrayOutputStream(); | 76 ByteArrayOutputStream bos = new ByteArrayOutputStream(); |
| 82 new HgBlameFacility(df).annotateSingleRevision(checkChangeset, new DiffOutInspector(new PrintStream(bos))); | 77 df.annotateSingleRevision(checkChangeset, new DiffOutInspector(new PrintStream(bos))); |
| 83 LineGrepOutputParser gp = new LineGrepOutputParser("^@@.+"); | 78 LineGrepOutputParser gp = new LineGrepOutputParser("^@@.+"); |
| 84 ExecHelper eh = new ExecHelper(gp, null); | 79 ExecHelper eh = new ExecHelper(gp, null); |
| 85 eh.run("hg", "diff", "-c", String.valueOf(checkChangeset), "-U", "0", fname); | 80 eh.run("hg", "diff", "-c", String.valueOf(checkChangeset), "-U", "0", fname); |
| 86 // | 81 // |
| 87 String[] apiResult = splitLines(bos.toString()); | 82 String[] apiResult = splitLines(bos.toString()); |
| 133 | 128 |
| 134 @Test | 129 @Test |
| 135 public void testComplexHistoryAnnotate() throws Exception { | 130 public void testComplexHistoryAnnotate() throws Exception { |
| 136 HgRepository repo = Configuration.get().find("test-annotate"); | 131 HgRepository repo = Configuration.get().find("test-annotate"); |
| 137 HgDataFile df = repo.getFileNode("file1"); | 132 HgDataFile df = repo.getFileNode("file1"); |
| 138 HgBlameFacility af = new HgBlameFacility(df); | |
| 139 ByteArrayOutputStream bos = new ByteArrayOutputStream(); | 133 ByteArrayOutputStream bos = new ByteArrayOutputStream(); |
| 140 DiffOutInspector dump = new DiffOutInspector(new PrintStream(bos)); | 134 DiffOutInspector dump = new DiffOutInspector(new PrintStream(bos)); |
| 141 af.annotate(TIP, dump, HgIterateDirection.OldToNew); | 135 df.annotate(TIP, dump, HgIterateDirection.OldToNew); |
| 142 LinkedList<String> apiResult = new LinkedList<String>(Arrays.asList(splitLines(bos.toString()))); | 136 LinkedList<String> apiResult = new LinkedList<String>(Arrays.asList(splitLines(bos.toString()))); |
| 143 | 137 |
| 144 /* | 138 /* |
| 145 * FIXME this is an ugly hack to deal with the way `hg diff -c <mergeRev>` describes the change | 139 * FIXME this is an ugly hack to deal with the way `hg diff -c <mergeRev>` describes the change |
| 146 * and our merge handling approach. For merged revision m, and lines changed both in p1 and p2 | 140 * and our merge handling approach. For merged revision m, and lines changed both in p1 and p2 |
| 194 @Test | 188 @Test |
| 195 public void testPartialHistoryFollow() throws Exception { | 189 public void testPartialHistoryFollow() throws Exception { |
| 196 HgRepository repo = Configuration.get().find("test-annotate2"); | 190 HgRepository repo = Configuration.get().find("test-annotate2"); |
| 197 HgDataFile df = repo.getFileNode("file1b.txt"); | 191 HgDataFile df = repo.getFileNode("file1b.txt"); |
| 198 // rev3: file1 -> file1a, rev7: file1a -> file1b, tip: rev10 | 192 // rev3: file1 -> file1a, rev7: file1a -> file1b, tip: rev10 |
| 199 HgBlameFacility bf = new HgBlameFacility(df); | |
| 200 DiffOutInspector insp = new DiffOutInspector(new PrintStream(new OutputStream() { | 193 DiffOutInspector insp = new DiffOutInspector(new PrintStream(new OutputStream() { |
| 201 @Override | 194 @Override |
| 202 public void write(int b) throws IOException { | 195 public void write(int b) throws IOException { |
| 203 // NULL OutputStream | 196 // NULL OutputStream |
| 204 } | 197 } |
| 205 })); | 198 })); |
| 206 // rev6 changes rev4, rev4 changes rev3. Plus, anything changed | 199 // rev6 changes rev4, rev4 changes rev3. Plus, anything changed |
| 207 // earlier than rev2 shall be reported as new from change3 | 200 // earlier than rev2 shall be reported as new from change3 |
| 208 int[] change_2_8_new2old = new int[] {4, 6, 3, 4, -1, 3}; | 201 int[] change_2_8_new2old = new int[] {4, 6, 3, 4, -1, 3}; |
| 209 int[] change_2_8_old2new = new int[] {-1, 3, 3, 4, 4, 6 }; | 202 int[] change_2_8_old2new = new int[] {-1, 3, 3, 4, 4, 6 }; |
| 210 bf.annotate(2, 8, insp, NewToOld); | 203 df.annotate(2, 8, insp, NewToOld); |
| 211 Assert.assertArrayEquals(change_2_8_new2old, insp.getReportedRevisionPairs()); | 204 Assert.assertArrayEquals(change_2_8_new2old, insp.getReportedRevisionPairs()); |
| 212 insp.reset(); | 205 insp.reset(); |
| 213 bf.annotate(2, 8, insp, OldToNew); | 206 df.annotate(2, 8, insp, OldToNew); |
| 214 Assert.assertArrayEquals(change_2_8_old2new, insp.getReportedRevisionPairs()); | 207 Assert.assertArrayEquals(change_2_8_old2new, insp.getReportedRevisionPairs()); |
| 215 // same as 2 to 8, with addition of rev9 changes rev7 (rev6 to rev7 didn't change content, only name) | 208 // same as 2 to 8, with addition of rev9 changes rev7 (rev6 to rev7 didn't change content, only name) |
| 216 int[] change_3_9_new2old = new int[] {7, 9, 4, 6, 3, 4, -1, 3 }; | 209 int[] change_3_9_new2old = new int[] {7, 9, 4, 6, 3, 4, -1, 3 }; |
| 217 int[] change_3_9_old2new = new int[] {-1, 3, 3, 4, 4, 6, 7, 9 }; | 210 int[] change_3_9_old2new = new int[] {-1, 3, 3, 4, 4, 6, 7, 9 }; |
| 218 insp.reset(); | 211 insp.reset(); |
| 219 bf.annotate(3, 9, insp, NewToOld); | 212 df.annotate(3, 9, insp, NewToOld); |
| 220 Assert.assertArrayEquals(change_3_9_new2old, insp.getReportedRevisionPairs()); | 213 Assert.assertArrayEquals(change_3_9_new2old, insp.getReportedRevisionPairs()); |
| 221 insp.reset(); | 214 insp.reset(); |
| 222 bf.annotate(3, 9, insp, OldToNew); | 215 df.annotate(3, 9, insp, OldToNew); |
| 223 Assert.assertArrayEquals(change_3_9_old2new, insp.getReportedRevisionPairs()); | 216 Assert.assertArrayEquals(change_3_9_old2new, insp.getReportedRevisionPairs()); |
| 224 } | 217 } |
| 225 | 218 |
| 226 @Test | 219 @Test |
| 227 public void testAnnotateCmdFollowNoFollow() throws Exception { | 220 public void testAnnotateCmdFollowNoFollow() throws Exception { |
| 295 private void aaa() throws Exception { | 288 private void aaa() throws Exception { |
| 296 HgRepository repo = new HgLookup().detectFromWorkingDir(); | 289 HgRepository repo = new HgLookup().detectFromWorkingDir(); |
| 297 final String fname = "src/org/tmatesoft/hg/internal/PatchGenerator.java"; | 290 final String fname = "src/org/tmatesoft/hg/internal/PatchGenerator.java"; |
| 298 final int checkChangeset = 539; | 291 final int checkChangeset = 539; |
| 299 HgDataFile df = repo.getFileNode(fname); | 292 HgDataFile df = repo.getFileNode(fname); |
| 300 HgBlameFacility af = new HgBlameFacility(df); | |
| 301 DiffOutInspector dump = new DiffOutInspector(System.out); | 293 DiffOutInspector dump = new DiffOutInspector(System.out); |
| 302 System.out.println("541 -> 543"); | 294 System.out.println("541 -> 543"); |
| 303 af.annotateSingleRevision(543, dump); | 295 df.annotateSingleRevision(543, dump); |
| 304 System.out.println("539 -> 541"); | 296 System.out.println("539 -> 541"); |
| 305 af.annotateSingleRevision(541, dump); | 297 df.annotateSingleRevision(541, dump); |
| 306 System.out.println("536 -> 539"); | 298 System.out.println("536 -> 539"); |
| 307 af.annotateSingleRevision(checkChangeset, dump); | 299 df.annotateSingleRevision(checkChangeset, dump); |
| 308 System.out.println("531 -> 536"); | 300 System.out.println("531 -> 536"); |
| 309 af.annotateSingleRevision(536, dump); | 301 df.annotateSingleRevision(536, dump); |
| 310 System.out.println(" -1 -> 531"); | 302 System.out.println(" -1 -> 531"); |
| 311 af.annotateSingleRevision(531, dump); | 303 df.annotateSingleRevision(531, dump); |
| 312 | 304 |
| 313 FileAnnotateInspector fai = new FileAnnotateInspector(); | 305 FileAnnotateInspector fai = new FileAnnotateInspector(); |
| 314 FileAnnotation.annotate(df, 541, fai); | 306 FileAnnotation.annotate(df, 541, fai); |
| 315 for (int i = 0; i < fai.lineRevisions.length; i++) { | 307 for (int i = 0; i < fai.lineRevisions.length; i++) { |
| 316 System.out.printf("%3d: LINE %d\n", fai.lineRevisions[i], i+1); | 308 System.out.printf("%3d: LINE %d\n", fai.lineRevisions[i], i+1); |
| 320 private void bbb() throws Exception { | 312 private void bbb() throws Exception { |
| 321 HgRepository repo = new HgLookup().detectFromWorkingDir(); | 313 HgRepository repo = new HgLookup().detectFromWorkingDir(); |
| 322 final String fname = "src/org/tmatesoft/hg/repo/HgManifest.java"; | 314 final String fname = "src/org/tmatesoft/hg/repo/HgManifest.java"; |
| 323 final int checkChangeset = 415; | 315 final int checkChangeset = 415; |
| 324 HgDataFile df = repo.getFileNode(fname); | 316 HgDataFile df = repo.getFileNode(fname); |
| 325 HgBlameFacility af = new HgBlameFacility(df); | |
| 326 DiffOutInspector dump = new DiffOutInspector(System.out); | 317 DiffOutInspector dump = new DiffOutInspector(System.out); |
| 327 // System.out.println("413 -> 415"); | 318 // System.out.println("413 -> 415"); |
| 328 // af.diff(df, 413, 415, dump); | 319 // af.diff(df, 413, 415, dump); |
| 329 // System.out.println("408 -> 415"); | 320 // System.out.println("408 -> 415"); |
| 330 // af.diff(df, 408, 415, dump); | 321 // af.diff(df, 408, 415, dump); |
| 331 // System.out.println("Combined (with merge):"); | 322 // System.out.println("Combined (with merge):"); |
| 332 // dump.needRevisions(true); | 323 // dump.needRevisions(true); |
| 333 // af.annotateChange(df, checkChangeset, dump); | 324 // af.annotateChange(df, checkChangeset, dump); |
| 334 dump.needRevisions(true); | 325 dump.needRevisions(true); |
| 335 af.annotate(checkChangeset, dump, HgIterateDirection.OldToNew); | 326 df.annotate(checkChangeset, dump, HgIterateDirection.OldToNew); |
| 336 } | 327 } |
| 337 | 328 |
| 338 private void ccc() throws Throwable { | 329 private void ccc() throws Throwable { |
| 339 HgRepository repo = new HgLookup().detect("/home/artem/hg/hgtest-annotate-merge/"); | 330 HgRepository repo = new HgLookup().detect("/home/artem/hg/hgtest-annotate-merge/"); |
| 340 HgDataFile df = repo.getFileNode("file.txt"); | 331 HgDataFile df = repo.getFileNode("file.txt"); |
| 341 HgBlameFacility af = new HgBlameFacility(df); | |
| 342 DiffOutInspector dump = new DiffOutInspector(System.out); | 332 DiffOutInspector dump = new DiffOutInspector(System.out); |
| 343 dump.needRevisions(true); | 333 dump.needRevisions(true); |
| 344 af.annotate(8, dump, HgIterateDirection.NewToOld); | 334 df.annotate(8, dump, HgIterateDirection.NewToOld); |
| 345 // af.annotateSingleRevision(df, 113, dump); | 335 // af.annotateSingleRevision(df, 113, dump); |
| 346 // System.out.println(); | 336 // System.out.println(); |
| 347 // af.annotate(df, TIP, new LineDumpInspector(true), HgIterateDirection.NewToOld); | 337 // af.annotate(df, TIP, new LineDumpInspector(true), HgIterateDirection.NewToOld); |
| 348 // System.out.println(); | 338 // System.out.println(); |
| 349 // af.annotate(df, TIP, new LineDumpInspector(false), HgIterateDirection.NewToOld); | 339 // af.annotate(df, TIP, new LineDumpInspector(false), HgIterateDirection.NewToOld); |
| 370 // System.out.println(Arrays.equals(new String[] { "a", "bc" }, splitLines("a\nbc\n"))); | 360 // System.out.println(Arrays.equals(new String[] { "a", "bc" }, splitLines("a\nbc\n"))); |
| 371 TestBlame tt = new TestBlame(); | 361 TestBlame tt = new TestBlame(); |
| 372 tt.ccc(); | 362 tt.ccc(); |
| 373 } | 363 } |
| 374 | 364 |
| 375 private static class DiffOutInspector implements HgBlameFacility.Inspector { | 365 private static class DiffOutInspector implements HgBlameInspector { |
| 376 private final PrintStream out; | 366 private final PrintStream out; |
| 377 private boolean dumpRevs; | 367 private boolean dumpRevs; |
| 378 private IntVector reportedRevisionPairs = new IntVector(); | 368 private IntVector reportedRevisionPairs = new IntVector(); |
| 379 | 369 |
| 380 DiffOutInspector(PrintStream ps) { | 370 DiffOutInspector(PrintStream ps) { |
| 488 public String line(int i) { | 478 public String line(int i) { |
| 489 return lines[i]; | 479 return lines[i]; |
| 490 } | 480 } |
| 491 } | 481 } |
| 492 | 482 |
| 493 private static class LineDumpInspector implements HgBlameFacility.Inspector { | 483 @SuppressWarnings("unused") |
| 484 private static class LineDumpInspector implements HgBlameInspector { | |
| 494 | 485 |
| 495 private final boolean lineByLine; | 486 private final boolean lineByLine; |
| 496 | 487 |
| 497 public LineDumpInspector(boolean lineByLine) { | 488 public LineDumpInspector(boolean lineByLine) { |
| 498 this.lineByLine = lineByLine; | 489 this.lineByLine = lineByLine; |
