comparison src/org/tmatesoft/hg/core/HgLogCommand.java @ 596:43cfa08ff3fd

HgBlameFacility refactoring: extract code to build file history that spans renames
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 02 May 2013 19:23:53 +0200
parents e4ee4bf4c7d0
children 6526d8adbc0f
comparison
equal deleted inserted replaced
595:92c3ad9c2a51 596:43cfa08ff3fd
28 import java.util.Comparator; 28 import java.util.Comparator;
29 import java.util.ConcurrentModificationException; 29 import java.util.ConcurrentModificationException;
30 import java.util.Iterator; 30 import java.util.Iterator;
31 import java.util.LinkedList; 31 import java.util.LinkedList;
32 import java.util.List; 32 import java.util.List;
33 import java.util.ListIterator;
34 import java.util.Set; 33 import java.util.Set;
35 import java.util.TreeSet; 34 import java.util.TreeSet;
36 35
37 import org.tmatesoft.hg.internal.AdapterPlug; 36 import org.tmatesoft.hg.internal.AdapterPlug;
38 import org.tmatesoft.hg.internal.BatchRangeHelper; 37 import org.tmatesoft.hg.internal.BatchRangeHelper;
40 import org.tmatesoft.hg.internal.IntMap; 39 import org.tmatesoft.hg.internal.IntMap;
41 import org.tmatesoft.hg.internal.IntVector; 40 import org.tmatesoft.hg.internal.IntVector;
42 import org.tmatesoft.hg.internal.Internals; 41 import org.tmatesoft.hg.internal.Internals;
43 import org.tmatesoft.hg.internal.Lifecycle; 42 import org.tmatesoft.hg.internal.Lifecycle;
44 import org.tmatesoft.hg.internal.LifecycleProxy; 43 import org.tmatesoft.hg.internal.LifecycleProxy;
44 import org.tmatesoft.hg.internal.ReverseIterator;
45 import org.tmatesoft.hg.repo.HgChangelog; 45 import org.tmatesoft.hg.repo.HgChangelog;
46 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; 46 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset;
47 import org.tmatesoft.hg.repo.HgDataFile; 47 import org.tmatesoft.hg.repo.HgDataFile;
48 import org.tmatesoft.hg.repo.HgInvalidControlFileException; 48 import org.tmatesoft.hg.repo.HgInvalidControlFileException;
49 import org.tmatesoft.hg.repo.HgInvalidStateException; 49 import org.tmatesoft.hg.repo.HgInvalidStateException;
444 public void next(int revisionIndex, Nodeid nodeid, RawChangeset cset) { 444 public void next(int revisionIndex, Nodeid nodeid, RawChangeset cset) {
445 batch.add(new BatchRecord(revisionIndex, nodeid, cset.clone())); 445 batch.add(new BatchRecord(revisionIndex, nodeid, cset.clone()));
446 } 446 }
447 447
448 public Iterable<BatchRecord> iterate(final boolean reverse) { 448 public Iterable<BatchRecord> iterate(final boolean reverse) {
449 return new Iterable<BatchRecord>() { 449 return reverse ? ReverseIterator.reversed(batch) : batch;
450
451 public Iterator<BatchRecord> iterator() {
452 return reverse ? new ReverseIterator<BatchRecord>(batch) : batch.iterator();
453 }
454 };
455 } 450 }
456 451
457 // alternative would be dispatch(HgChangelog.Inspector) and dispatchReverse() 452 // alternative would be dispatch(HgChangelog.Inspector) and dispatchReverse()
458 // methods, but progress and cancellation might get messy then 453 // methods, but progress and cancellation might get messy then
459 } 454 }
561 } // for fileRenamesQueue; 556 } // for fileRenamesQueue;
562 frqBuilder.reportRenameIfNotInQueue(fileRenamesQueue, renameHandler); 557 frqBuilder.reportRenameIfNotInQueue(fileRenamesQueue, renameHandler);
563 progressHelper.done(); 558 progressHelper.done();
564 } 559 }
565 560
566 private static class ReverseIterator<E> implements Iterator<E> {
567 private final ListIterator<E> listIterator;
568
569 public ReverseIterator(List<E> list) {
570 listIterator = list.listIterator(list.size());
571 }
572
573 public boolean hasNext() {
574 return listIterator.hasPrevious();
575 }
576 public E next() {
577 return listIterator.previous();
578 }
579 public void remove() {
580 listIterator.remove();
581 }
582 }
583
584 /** 561 /**
585 * Utility to build sequence of file renames 562 * Utility to build sequence of file renames
586 */ 563 */
587 private class FileRenameQueueBuilder { 564 private class FileRenameQueueBuilder {
588 565