Mercurial > hg4j
comparison test/org/tmatesoft/hg/test/TestHistory.java @ 528:f7fbf48b9383
Report rename when walking file history regardless of followRenames parameter, solely based on HgFileRenameHandlerMixin presence
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 17 Jan 2013 19:23:52 +0100 |
parents | 2103388d4010 |
children | 6526d8adbc0f |
comparison
equal
deleted
inserted
replaced
527:47b7bedf0569 | 528:f7fbf48b9383 |
---|---|
36 import org.tmatesoft.hg.core.HgChangeset; | 36 import org.tmatesoft.hg.core.HgChangeset; |
37 import org.tmatesoft.hg.core.HgChangesetHandler; | 37 import org.tmatesoft.hg.core.HgChangesetHandler; |
38 import org.tmatesoft.hg.core.HgChangesetTreeHandler; | 38 import org.tmatesoft.hg.core.HgChangesetTreeHandler; |
39 import org.tmatesoft.hg.core.HgFileRenameHandlerMixin; | 39 import org.tmatesoft.hg.core.HgFileRenameHandlerMixin; |
40 import org.tmatesoft.hg.core.HgFileRevision; | 40 import org.tmatesoft.hg.core.HgFileRevision; |
41 import org.tmatesoft.hg.core.HgIterateDirection; | |
41 import org.tmatesoft.hg.core.HgLogCommand; | 42 import org.tmatesoft.hg.core.HgLogCommand; |
42 import org.tmatesoft.hg.core.HgLogCommand.CollectHandler; | 43 import org.tmatesoft.hg.core.HgLogCommand.CollectHandler; |
43 import org.tmatesoft.hg.core.Nodeid; | 44 import org.tmatesoft.hg.core.Nodeid; |
44 import org.tmatesoft.hg.internal.AdapterPlug; | 45 import org.tmatesoft.hg.internal.AdapterPlug; |
45 import org.tmatesoft.hg.repo.HgLookup; | 46 import org.tmatesoft.hg.repo.HgLookup; |
232 assertTrue("[sanity]", repo.getFileNode(fname2).exists()); | 233 assertTrue("[sanity]", repo.getFileNode(fname2).exists()); |
233 final List<Record> fname2Follow = getAncestryWithoutRenamesFromCmdline(fname2); | 234 final List<Record> fname2Follow = getAncestryWithoutRenamesFromCmdline(fname2); |
234 | 235 |
235 CollectWithRenameHandler h = new CollectWithRenameHandler(); | 236 CollectWithRenameHandler h = new CollectWithRenameHandler(); |
236 new HgLogCommand(repo).file(fname2, false, true).execute(h); | 237 new HgLogCommand(repo).file(fname2, false, true).execute(h); |
237 errorCollector.assertEquals(0, h.rh.renames.size()); | 238 // renames are reported regardless of followRenames parameter, but |
239 // solely based on HgFileRenameHandlerMixin | |
240 errorCollector.assertEquals(1, h.rh.renames.size()); | |
238 report("HgChangesetHandler(renames: false, ancestry:true)", h.getChanges(), fname2Follow, true, errorCollector); | 241 report("HgChangesetHandler(renames: false, ancestry:true)", h.getChanges(), fname2Follow, true, errorCollector); |
239 // | 242 // |
240 // Direction | 243 // Direction |
241 h = new CollectWithRenameHandler(); | 244 h = new CollectWithRenameHandler(); |
242 new HgLogCommand(repo).file(fname2, false, true).order(NewToOld).execute(h); | 245 new HgLogCommand(repo).file(fname2, false, true).order(NewToOld).execute(h); |
250 repo = Configuration.get().find("log-follow"); | 253 repo = Configuration.get().find("log-follow"); |
251 final String fname2 = "file1_b"; | 254 final String fname2 = "file1_b"; |
252 final List<Record> fname2Follow = getAncestryWithoutRenamesFromCmdline(fname2); | 255 final List<Record> fname2Follow = getAncestryWithoutRenamesFromCmdline(fname2); |
253 | 256 |
254 TreeCollectHandler h = new TreeCollectHandler(false); | 257 TreeCollectHandler h = new TreeCollectHandler(false); |
255 RenameCollector rh = new RenameCollector(h); | |
256 h.checkPrevInParents = true; | 258 h.checkPrevInParents = true; |
257 new HgLogCommand(repo).file(fname2, false, true).execute(h); | 259 new HgLogCommand(repo).file(fname2, false, true).execute(h); |
258 errorCollector.assertEquals(0, rh.renames.size()); | |
259 report("HgChangesetTreeHandler(renames: false, ancestry:true)", h.getResult(), fname2Follow, true, errorCollector); | 260 report("HgChangesetTreeHandler(renames: false, ancestry:true)", h.getResult(), fname2Follow, true, errorCollector); |
260 | 261 |
261 // Direction | 262 // Direction |
262 h = new TreeCollectHandler(false); | 263 h = new TreeCollectHandler(false); |
263 rh = new RenameCollector(h); | |
264 h.checkPrevInChildren = true; | 264 h.checkPrevInChildren = true; |
265 new HgLogCommand(repo).file(fname2, false, true).order(NewToOld).execute(h); | 265 new HgLogCommand(repo).file(fname2, false, true).order(NewToOld).execute(h); |
266 report("HgChangesetTreeHandler(renames: false, ancestry:true)", h.getResult(), fname2Follow, false, errorCollector); | 266 report("HgChangesetTreeHandler(renames: false, ancestry:true)", h.getResult(), fname2Follow, false, errorCollector); |
267 } | 267 } |
268 | 268 |
349 report("execute with HgChangesetTreeHandler(follow == true)", h.getResult(), false); | 349 report("execute with HgChangesetTreeHandler(follow == true)", h.getResult(), false); |
350 | 350 |
351 assertEquals(1, rh.renames.size()); | 351 assertEquals(1, rh.renames.size()); |
352 assertEquals(Path.create(fname), rh.renames.get(0).second().getPath()); | 352 assertEquals(Path.create(fname), rh.renames.get(0).second().getPath()); |
353 } | 353 } |
354 | |
355 /** | |
356 * Ensure {@link HgFileRenameHandlerMixin} is always notified, even | |
357 * if followRename is false. | |
358 * Shall check: | |
359 * both {@link HgLogCommand#execute(HgChangesetHandler)} and {@link HgLogCommand#execute(HgChangesetTreeHandler)} | |
360 * and for both iteration directions in each case | |
361 */ | |
362 @Test | |
363 public void testRenameHandlerNotifiedEvenIfNotFollowRename() throws Exception { | |
364 repo = Configuration.get().find("log-follow"); | |
365 final String fname1 = "file1_a"; | |
366 final String fname2 = "file1_b"; | |
367 final String fnameNoRename = "file2"; | |
368 assertTrue("[sanity]", repo.getFileNode(fnameNoRename).exists()); | |
369 | |
370 // first, check that file without renames doesn't report any accidentally | |
371 CollectWithRenameHandler h1 = new CollectWithRenameHandler(); | |
372 HgLogCommand cmd = new HgLogCommand(repo).file(fnameNoRename, false, false); | |
373 cmd.execute(h1); | |
374 errorCollector.assertEquals(0, h1.rh.renames.size()); | |
375 TreeCollectHandler h2 = new TreeCollectHandler(false); | |
376 RenameCollector rh = new RenameCollector(h2); | |
377 cmd.execute(h2); | |
378 errorCollector.assertEquals(0, rh.renames.size()); | |
379 | |
380 // check default iterate direction | |
381 cmd = new HgLogCommand(repo).file(fname2, false, false); | |
382 cmd.execute(h1 = new CollectWithRenameHandler()); | |
383 errorCollector.assertEquals(1, h1.rh.renames.size()); | |
384 assertRename(fname1, fname2, h1.rh.renames.get(0)); | |
385 | |
386 h2 = new TreeCollectHandler(false); | |
387 rh = new RenameCollector(h2); | |
388 cmd.execute(h2); | |
389 errorCollector.assertEquals(1, rh.renames.size()); | |
390 assertRename(fname1, fname2, rh.renames.get(0)); | |
391 | |
392 eh.run("hg", "log", "--debug", fname2, "--cwd", repo.getLocation()); | |
393 report("HgChangesetHandler+RenameHandler with followRenames = false, default iteration order", h1.getChanges(), true); | |
394 report("HgChangesetTreeHandler+RenameHandler with followRenames = false, default iteration order", h2.getResult(), true); | |
395 | |
396 // | |
397 // Now, check that iteration in opposite direction (new to old) | |
398 // still reports renames (and correct revisions, too) | |
399 cmd.order(HgIterateDirection.NewToOld); | |
400 cmd.execute(h1 = new CollectWithRenameHandler()); | |
401 errorCollector.assertEquals(1, h1.rh.renames.size()); | |
402 assertRename(fname1, fname2, h1.rh.renames.get(0)); | |
403 h2 = new TreeCollectHandler(false); | |
404 rh = new RenameCollector(h2); | |
405 cmd.execute(h2); | |
406 errorCollector.assertEquals(1, rh.renames.size()); | |
407 assertRename(fname1, fname2, rh.renames.get(0)); | |
408 report("HgChangesetHandler+RenameHandler with followRenames = false, new2old iteration order", h1.getChanges(), false); | |
409 report("HgChangesetTreeHandler+RenameHandler with followRenames = false, new2old iteration order", h2.getResult(), false); | |
410 } | |
411 | |
412 private void assertRename(String fnameFrom, String fnameTo, Pair<HgFileRevision, HgFileRevision> rename) { | |
413 errorCollector.assertEquals(fnameFrom, rename.first().getPath().toString()); | |
414 errorCollector.assertEquals(fnameTo, rename.second().getPath().toString()); | |
415 } | |
354 | 416 |
355 /** | 417 /** |
356 * @see TestAuxUtilities#testChangelogCancelSupport() | 418 * @see TestAuxUtilities#testChangelogCancelSupport() |
357 */ | 419 */ |
358 @Test | 420 @Test |
621 } | 683 } |
622 | 684 |
623 public RenameCollector(AdapterPlug ap) { | 685 public RenameCollector(AdapterPlug ap) { |
624 ap.attachAdapter(HgFileRenameHandlerMixin.class, this); | 686 ap.attachAdapter(HgFileRenameHandlerMixin.class, this); |
625 } | 687 } |
626 | 688 |
627 public void copy(HgFileRevision from, HgFileRevision to) { | 689 public void copy(HgFileRevision from, HgFileRevision to) { |
628 copyReported = true; | 690 copyReported = true; |
629 renames.add(new Pair<HgFileRevision, HgFileRevision>(from, to)); | 691 renames.add(new Pair<HgFileRevision, HgFileRevision>(from, to)); |
630 } | 692 } |
631 } | 693 } |