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 }