Mercurial > hg4j
comparison src/org/tmatesoft/hg/core/LogCommand.java @ 129:645829962785
core.Cset renamed to HgChangeset; repo.Changeset moved into HgChangelog
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Wed, 16 Feb 2011 20:32:29 +0100 | 
| parents | b92a638764be | 
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 128:44b97930570c | 129:645829962785 | 
|---|---|
| 24 import java.util.LinkedList; | 24 import java.util.LinkedList; | 
| 25 import java.util.List; | 25 import java.util.List; | 
| 26 import java.util.Set; | 26 import java.util.Set; | 
| 27 import java.util.TreeSet; | 27 import java.util.TreeSet; | 
| 28 | 28 | 
| 29 import org.tmatesoft.hg.repo.Changeset; | 29 import org.tmatesoft.hg.repo.HgChangelog.Changeset; | 
| 30 import org.tmatesoft.hg.repo.HgChangelog; | |
| 30 import org.tmatesoft.hg.repo.HgDataFile; | 31 import org.tmatesoft.hg.repo.HgDataFile; | 
| 31 import org.tmatesoft.hg.repo.HgRepository; | 32 import org.tmatesoft.hg.repo.HgRepository; | 
| 32 import org.tmatesoft.hg.repo.HgStatusCollector; | 33 import org.tmatesoft.hg.repo.HgStatusCollector; | 
| 33 import org.tmatesoft.hg.util.PathPool; | 34 import org.tmatesoft.hg.util.PathPool; | 
| 34 | 35 | 
| 40 * Not thread-safe (each thread has to use own {@link LogCommand} instance). | 41 * Not thread-safe (each thread has to use own {@link LogCommand} instance). | 
| 41 * | 42 * | 
| 42 * @author Artem Tikhomirov | 43 * @author Artem Tikhomirov | 
| 43 * @author TMate Software Ltd. | 44 * @author TMate Software Ltd. | 
| 44 */ | 45 */ | 
| 45 public class LogCommand implements Changeset.Inspector { | 46 public class LogCommand implements HgChangelog.Inspector { | 
| 46 | 47 | 
| 47 private final HgRepository repo; | 48 private final HgRepository repo; | 
| 48 private Set<String> users; | 49 private Set<String> users; | 
| 49 private Set<String> branches; | 50 private Set<String> branches; | 
| 50 private int limit = 0, count = 0; | 51 private int limit = 0, count = 0; | 
| 51 private int startRev = 0, endRev = TIP; | 52 private int startRev = 0, endRev = TIP; | 
| 52 private Handler delegate; | 53 private Handler delegate; | 
| 53 private Calendar date; | 54 private Calendar date; | 
| 54 private Path file; | 55 private Path file; | 
| 55 private boolean followHistory; // makes sense only when file != null | 56 private boolean followHistory; // makes sense only when file != null | 
| 56 private Cset changeset; | 57 private HgChangeset changeset; | 
| 57 | 58 | 
| 58 public LogCommand(HgRepository hgRepo) { | 59 public LogCommand(HgRepository hgRepo) { | 
| 59 repo = hgRepo; | 60 repo = hgRepo; | 
| 60 } | 61 } | 
| 61 | 62 | 
| 145 } | 146 } | 
| 146 | 147 | 
| 147 /** | 148 /** | 
| 148 * Similar to {@link #execute(org.tmatesoft.hg.repo.Changeset.Inspector)}, collects and return result as a list. | 149 * Similar to {@link #execute(org.tmatesoft.hg.repo.Changeset.Inspector)}, collects and return result as a list. | 
| 149 */ | 150 */ | 
| 150 public List<Cset> execute() { | 151 public List<HgChangeset> execute() { | 
| 151 CollectHandler collector = new CollectHandler(); | 152 CollectHandler collector = new CollectHandler(); | 
| 152 execute(collector); | 153 execute(collector); | 
| 153 return collector.getChanges(); | 154 return collector.getChanges(); | 
| 154 } | 155 } | 
| 155 | 156 | 
| 167 throw new ConcurrentModificationException(); | 168 throw new ConcurrentModificationException(); | 
| 168 } | 169 } | 
| 169 try { | 170 try { | 
| 170 delegate = handler; | 171 delegate = handler; | 
| 171 count = 0; | 172 count = 0; | 
| 172 changeset = new Cset(new HgStatusCollector(repo), new PathPool(repo.getPathHelper())); | 173 changeset = new HgChangeset(new HgStatusCollector(repo), new PathPool(repo.getPathHelper())); | 
| 173 if (file == null) { | 174 if (file == null) { | 
| 174 repo.getChangelog().range(startRev, endRev, this); | 175 repo.getChangelog().range(startRev, endRev, this); | 
| 175 } else { | 176 } else { | 
| 176 HgDataFile fileNode = repo.getFileNode(file); | 177 HgDataFile fileNode = repo.getFileNode(file); | 
| 177 fileNode.history(startRev, endRev, this); | 178 fileNode.history(startRev, endRev, this); | 
| 230 delegate.next(changeset); | 231 delegate.next(changeset); | 
| 231 } | 232 } | 
| 232 | 233 | 
| 233 public interface Handler { | 234 public interface Handler { | 
| 234 /** | 235 /** | 
| 235 * @param changeset not necessarily a distinct instance each time, {@link Cset#clone() clone()} if need a copy. | 236 * @param changeset not necessarily a distinct instance each time, {@link HgChangeset#clone() clone()} if need a copy. | 
| 236 */ | 237 */ | 
| 237 void next(Cset changeset); | 238 void next(HgChangeset changeset); | 
| 238 } | 239 } | 
| 239 | 240 | 
| 240 /** | 241 /** | 
| 241 * When {@link LogCommand} is executed against file, handler passed to {@link LogCommand#execute(Handler)} may optionally | 242 * When {@link LogCommand} is executed against file, handler passed to {@link LogCommand#execute(Handler)} may optionally | 
| 242 * implement this interface to get information about file renames. Method {@link #copy(FileRevision, FileRevision)} would | 243 * implement this interface to get information about file renames. Method {@link #copy(FileRevision, FileRevision)} would | 
| 243 * get invoked prior any changeset of the original file (if file history being followed) is reported via {@link #next(Cset)}. | 244 * get invoked prior any changeset of the original file (if file history being followed) is reported via {@link #next(HgChangeset)}. | 
| 244 * | 245 * | 
| 245 * For {@link LogCommand#file(Path, boolean)} with renamed file path and follow argument set to false, | 246 * For {@link LogCommand#file(Path, boolean)} with renamed file path and follow argument set to false, | 
| 246 * {@link #copy(FileRevision, FileRevision)} would be invoked for the first copy/rename in the history of the file, but not | 247 * {@link #copy(FileRevision, FileRevision)} would be invoked for the first copy/rename in the history of the file, but not | 
| 247 * followed by any changesets. | 248 * followed by any changesets. | 
| 248 * | 249 * | 
| 253 // XXX perhaps, should distinguish copy from rename? And what about merged revisions and following them? | 254 // XXX perhaps, should distinguish copy from rename? And what about merged revisions and following them? | 
| 254 void copy(FileRevision from, FileRevision to); | 255 void copy(FileRevision from, FileRevision to); | 
| 255 } | 256 } | 
| 256 | 257 | 
| 257 public static class CollectHandler implements Handler { | 258 public static class CollectHandler implements Handler { | 
| 258 private final List<Cset> result = new LinkedList<Cset>(); | 259 private final List<HgChangeset> result = new LinkedList<HgChangeset>(); | 
| 259 | 260 | 
| 260 public List<Cset> getChanges() { | 261 public List<HgChangeset> getChanges() { | 
| 261 return Collections.unmodifiableList(result); | 262 return Collections.unmodifiableList(result); | 
| 262 } | 263 } | 
| 263 | 264 | 
| 264 public void next(Cset changeset) { | 265 public void next(HgChangeset changeset) { | 
| 265 result.add(changeset.clone()); | 266 result.add(changeset.clone()); | 
| 266 } | 267 } | 
| 267 } | 268 } | 
| 268 | 269 | 
| 269 public static final class FileRevision { | 270 public static final class FileRevision { | 
