comparison src/org/tmatesoft/hg/core/HgLogCommand.java @ 193:37f3d4a596e4

Use common low to hi-level changeset api transformer
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 15 Apr 2011 03:28:12 +0200
parents d5268ca7715b
children c9b305df0b89
comparison
equal deleted inserted replaced
192:e5407b5a586a 193:37f3d4a596e4
29 29
30 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset; 30 import org.tmatesoft.hg.repo.HgChangelog.RawChangeset;
31 import org.tmatesoft.hg.repo.HgChangelog; 31 import org.tmatesoft.hg.repo.HgChangelog;
32 import org.tmatesoft.hg.repo.HgDataFile; 32 import org.tmatesoft.hg.repo.HgDataFile;
33 import org.tmatesoft.hg.repo.HgRepository; 33 import org.tmatesoft.hg.repo.HgRepository;
34 import org.tmatesoft.hg.repo.HgStatusCollector;
35 import org.tmatesoft.hg.util.ByteChannel; 34 import org.tmatesoft.hg.util.ByteChannel;
36 import org.tmatesoft.hg.util.CancelledException; 35 import org.tmatesoft.hg.util.CancelledException;
37 import org.tmatesoft.hg.util.Path; 36 import org.tmatesoft.hg.util.Path;
38 import org.tmatesoft.hg.util.PathPool;
39 import org.tmatesoft.hg.util.PathRewrite;
40 37
41 38
42 /** 39 /**
43 * Access to changelog, 'hg log' command counterpart. 40 * Access to changelog, 'hg log' command counterpart.
44 * 41 *
56 private final HgRepository repo; 53 private final HgRepository repo;
57 private Set<String> users; 54 private Set<String> users;
58 private Set<String> branches; 55 private Set<String> branches;
59 private int limit = 0, count = 0; 56 private int limit = 0, count = 0;
60 private int startRev = 0, endRev = TIP; 57 private int startRev = 0, endRev = TIP;
61 private Handler delegate;
62 private Calendar date; 58 private Calendar date;
63 private Path file; 59 private Path file;
64 private boolean followHistory; // makes sense only when file != null 60 private boolean followHistory; // makes sense only when file != null
65 private HgChangeset changeset; 61 private ChangesetTransformer csetTransform;
66 62
67 public HgLogCommand(HgRepository hgRepo) { 63 public HgLogCommand(HgRepository hgRepo) {
68 repo = hgRepo; 64 repo = hgRepo;
69 } 65 }
70 66
181 */ 177 */
182 public void execute(Handler handler) throws HgException { 178 public void execute(Handler handler) throws HgException {
183 if (handler == null) { 179 if (handler == null) {
184 throw new IllegalArgumentException(); 180 throw new IllegalArgumentException();
185 } 181 }
186 if (delegate != null) { 182 if (csetTransform != null) {
187 throw new ConcurrentModificationException(); 183 throw new ConcurrentModificationException();
188 } 184 }
189 try { 185 try {
190 delegate = handler;
191 count = 0; 186 count = 0;
192 HgStatusCollector statusCollector = new HgStatusCollector(repo); 187 // ChangesetTransfrom creates a blank PathPool, and #file(String, boolean) above
193 // files listed in a changeset don't need their names to be rewritten (they are normalized already) 188 // may utilize it as well. CommandContext? How about StatusCollector there as well?
194 PathPool pp = new PathPool(new PathRewrite.Empty()); 189 csetTransform = new ChangesetTransformer(repo, handler);
195 // #file(String, boolean) above may utilize PathPool as well. CommandContext?
196 statusCollector.setPathPool(pp);
197 changeset = new HgChangeset(statusCollector, pp);
198 if (file == null) { 190 if (file == null) {
199 repo.getChangelog().range(startRev, endRev, this); 191 repo.getChangelog().range(startRev, endRev, this);
200 } else { 192 } else {
201 HgDataFile fileNode = repo.getFileNode(file); 193 HgDataFile fileNode = repo.getFileNode(file);
202 fileNode.history(startRev, endRev, this); 194 fileNode.history(startRev, endRev, this);
218 } 210 }
219 } while (followHistory && fileNode.isCopy()); 211 } while (followHistory && fileNode.isCopy());
220 } 212 }
221 } 213 }
222 } finally { 214 } finally {
223 delegate = null; 215 csetTransform = null;
224 changeset = null;
225 } 216 }
226 } 217 }
227 218
228 // 219 //
229 220
249 } 240 }
250 if (date != null) { 241 if (date != null) {
251 // FIXME 242 // FIXME
252 } 243 }
253 count++; 244 count++;
254 changeset.init(revisionNumber, nodeid, cset); 245 csetTransform.next(revisionNumber, nodeid, cset);
255 delegate.next(changeset);
256 } 246 }
257 247
258 public interface Handler { 248 public interface Handler {
259 /** 249 /**
260 * @param changeset not necessarily a distinct instance each time, {@link HgChangeset#clone() clone()} if need a copy. 250 * @param changeset not necessarily a distinct instance each time, {@link HgChangeset#clone() clone()} if need a copy.