Mercurial > hg4j
comparison src/org/tmatesoft/hg/core/StatusCommand.java @ 109:dd4d2d0e42cd
Handler for StatusCommand to get notifications in the form of HgStatus object
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Sat, 29 Jan 2011 04:17:13 +0100 |
| parents | a3a2e5deb320 |
| children | 4f509f5bc8cb |
comparison
equal
deleted
inserted
replaced
| 108:0c9804857000 | 109:dd4d2d0e42cd |
|---|---|
| 14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
| 15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
| 16 */ | 16 */ |
| 17 package org.tmatesoft.hg.core; | 17 package org.tmatesoft.hg.core; |
| 18 | 18 |
| 19 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; | 19 import static org.tmatesoft.hg.core.StatusCommand.HgStatus.Kind.*; |
| 20 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 20 import static org.tmatesoft.hg.repo.HgRepository.*; |
| 21 import static org.tmatesoft.hg.repo.HgRepository.WORKING_COPY; | |
| 22 | 21 |
| 23 import java.util.ConcurrentModificationException; | 22 import java.util.ConcurrentModificationException; |
| 24 | 23 |
| 25 import org.tmatesoft.hg.core.LogCommand.FileRevision; | |
| 26 import org.tmatesoft.hg.core.Path.Matcher; | 24 import org.tmatesoft.hg.core.Path.Matcher; |
| 25 import org.tmatesoft.hg.core.StatusCommand.HgStatus.Kind; | |
| 27 import org.tmatesoft.hg.repo.HgRepository; | 26 import org.tmatesoft.hg.repo.HgRepository; |
| 27 import org.tmatesoft.hg.repo.HgStatusCollector; | |
| 28 import org.tmatesoft.hg.repo.HgStatusInspector; | 28 import org.tmatesoft.hg.repo.HgStatusInspector; |
| 29 import org.tmatesoft.hg.repo.HgStatusCollector; | |
| 30 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; | 29 import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; |
| 31 | 30 |
| 32 /** | 31 /** |
| 33 * | 32 * |
| 34 * @author Artem Tikhomirov | 33 * @author Artem Tikhomirov |
| 39 | 38 |
| 40 private int startRevision = TIP; | 39 private int startRevision = TIP; |
| 41 private int endRevision = WORKING_COPY; | 40 private int endRevision = WORKING_COPY; |
| 42 private boolean visitSubRepo = true; | 41 private boolean visitSubRepo = true; |
| 43 | 42 |
| 44 private HgStatusInspector visitor; | 43 private Handler handler; |
| 45 private final Mediator mediator = new Mediator(); | 44 private final Mediator mediator = new Mediator(); |
| 46 | 45 |
| 47 public StatusCommand(HgRepository hgRepo) { | 46 public StatusCommand(HgRepository hgRepo) { |
| 48 repo = hgRepo; | 47 repo = hgRepo; |
| 49 defaults(); | 48 defaults(); |
| 141 * | 140 * |
| 142 * @param handler callback to get status information | 141 * @param handler callback to get status information |
| 143 * @throws IllegalArgumentException if handler is <code>null</code> | 142 * @throws IllegalArgumentException if handler is <code>null</code> |
| 144 * @throws ConcurrentModificationException if this command already runs (i.e. being used from another thread) | 143 * @throws ConcurrentModificationException if this command already runs (i.e. being used from another thread) |
| 145 */ | 144 */ |
| 146 public void execute(final HgStatusInspector handler) { | 145 public void execute(Handler statusHandler) { |
| 147 if (handler == null) { | 146 if (statusHandler == null) { |
| 148 throw new IllegalArgumentException(); | 147 throw new IllegalArgumentException(); |
| 149 } | 148 } |
| 150 if (visitor != null) { | 149 if (handler != null) { |
| 151 throw new ConcurrentModificationException(); | 150 throw new ConcurrentModificationException(); |
| 152 } | 151 } |
| 153 visitor = handler; | 152 handler = statusHandler; |
| 154 HgStatusCollector sc = new HgStatusCollector(repo); // TODO from CommandContext | 153 HgStatusCollector sc = new HgStatusCollector(repo); // TODO from CommandContext |
| 155 // PathPool pathHelper = new PathPool(repo.getPathHelper()); // TODO from CommandContext | 154 // PathPool pathHelper = new PathPool(repo.getPathHelper()); // TODO from CommandContext |
| 156 try { | 155 try { |
| 157 // XXX if I need a rough estimation (for ProgressMonitor) of number of work units, | 156 // XXX if I need a rough estimation (for ProgressMonitor) of number of work units, |
| 158 // I may use number of files in either rev1 or rev2 manifest edition | 157 // I may use number of files in either rev1 or rev2 manifest edition |
| 168 sc.walk(startRevision, endRevision, mediator); | 167 sc.walk(startRevision, endRevision, mediator); |
| 169 } | 168 } |
| 170 } | 169 } |
| 171 } finally { | 170 } finally { |
| 172 mediator.done(); | 171 mediator.done(); |
| 173 visitor = null; | 172 handler = null; |
| 174 } | 173 } |
| 175 } | 174 } |
| 176 | 175 |
| 176 public interface Handler { | |
| 177 void handleStatus(HgStatus s); | |
| 178 } | |
| 179 | |
| 180 public static class HgStatus { | |
| 181 public enum Kind { | |
| 182 Modified, Added, Removed, Unknown, Missing, Clean, Ignored | |
| 183 }; | |
| 184 private final Kind kind; | |
| 185 private final Path path; | |
| 186 private final Path origin; | |
| 187 | |
| 188 HgStatus(Kind kind, Path path) { | |
| 189 this(kind, path, null); | |
| 190 } | |
| 191 | |
| 192 HgStatus(Kind kind, Path path, Path copyOrigin) { | |
| 193 this.kind = kind; | |
| 194 this.path = path; | |
| 195 origin = copyOrigin; | |
| 196 } | |
| 197 | |
| 198 public Kind getKind() { | |
| 199 return kind; | |
| 200 } | |
| 201 | |
| 202 public Path getPath() { | |
| 203 return path; | |
| 204 } | |
| 205 | |
| 206 public Path getOriginalPath() { | |
| 207 return origin; | |
| 208 } | |
| 209 | |
| 210 public boolean isCopy() { | |
| 211 return origin != null; | |
| 212 } | |
| 213 } | |
| 214 | |
| 215 | |
| 177 private class Mediator implements HgStatusInspector { | 216 private class Mediator implements HgStatusInspector { |
| 178 boolean needModified; | 217 boolean needModified; |
| 179 boolean needAdded; | 218 boolean needAdded; |
| 180 boolean needRemoved; | 219 boolean needRemoved; |
| 181 boolean needUnknown; | 220 boolean needUnknown; |
| 195 } | 234 } |
| 196 | 235 |
| 197 public void modified(Path fname) { | 236 public void modified(Path fname) { |
| 198 if (needModified) { | 237 if (needModified) { |
| 199 if (matcher == null || matcher.accept(fname)) { | 238 if (matcher == null || matcher.accept(fname)) { |
| 200 visitor.modified(fname); | 239 handler.handleStatus(new HgStatus(Modified, fname)); |
| 201 } | 240 } |
| 202 } | 241 } |
| 203 } | 242 } |
| 204 public void added(Path fname) { | 243 public void added(Path fname) { |
| 205 if (needAdded) { | 244 if (needAdded) { |
| 206 if (matcher == null || matcher.accept(fname)) { | 245 if (matcher == null || matcher.accept(fname)) { |
| 207 visitor.added(fname); | 246 handler.handleStatus(new HgStatus(Added, fname)); |
| 208 } | 247 } |
| 209 } | 248 } |
| 210 } | 249 } |
| 211 public void removed(Path fname) { | 250 public void removed(Path fname) { |
| 212 if (needRemoved) { | 251 if (needRemoved) { |
| 213 if (matcher == null || matcher.accept(fname)) { | 252 if (matcher == null || matcher.accept(fname)) { |
| 214 visitor.removed(fname); | 253 handler.handleStatus(new HgStatus(Removed, fname)); |
| 215 } | 254 } |
| 216 } | 255 } |
| 217 } | 256 } |
| 218 public void copied(Path fnameOrigin, Path fnameAdded) { | 257 public void copied(Path fnameOrigin, Path fnameAdded) { |
| 219 if (needCopies) { | 258 if (needCopies) { |
| 220 if (matcher == null || matcher.accept(fnameAdded)) { | 259 if (matcher == null || matcher.accept(fnameAdded)) { |
| 221 visitor.copied(fnameOrigin, fnameAdded); | 260 handler.handleStatus(new HgStatus(Kind.Added, fnameAdded, fnameOrigin)); |
| 222 } | 261 } |
| 223 } | 262 } |
| 224 } | 263 } |
| 225 public void missing(Path fname) { | 264 public void missing(Path fname) { |
| 226 if (needMissing) { | 265 if (needMissing) { |
| 227 if (matcher == null || matcher.accept(fname)) { | 266 if (matcher == null || matcher.accept(fname)) { |
| 228 visitor.missing(fname); | 267 handler.handleStatus(new HgStatus(Missing, fname)); |
| 229 } | 268 } |
| 230 } | 269 } |
| 231 } | 270 } |
| 232 public void unknown(Path fname) { | 271 public void unknown(Path fname) { |
| 233 if (needUnknown) { | 272 if (needUnknown) { |
| 234 if (matcher == null || matcher.accept(fname)) { | 273 if (matcher == null || matcher.accept(fname)) { |
| 235 visitor.unknown(fname); | 274 handler.handleStatus(new HgStatus(Unknown, fname)); |
| 236 } | 275 } |
| 237 } | 276 } |
| 238 } | 277 } |
| 239 public void clean(Path fname) { | 278 public void clean(Path fname) { |
| 240 if (needClean) { | 279 if (needClean) { |
| 241 if (matcher == null || matcher.accept(fname)) { | 280 if (matcher == null || matcher.accept(fname)) { |
| 242 visitor.clean(fname); | 281 handler.handleStatus(new HgStatus(Clean, fname)); |
| 243 } | 282 } |
| 244 } | 283 } |
| 245 } | 284 } |
| 246 public void ignored(Path fname) { | 285 public void ignored(Path fname) { |
| 247 if (needIgnored) { | 286 if (needIgnored) { |
| 248 if (matcher == null || matcher.accept(fname)) { | 287 if (matcher == null || matcher.accept(fname)) { |
| 249 visitor.ignored(fname); | 288 handler.handleStatus(new HgStatus(Ignored, fname)); |
| 250 } | 289 } |
| 251 } | 290 } |
| 252 } | 291 } |
| 253 } | 292 } |
| 254 } | 293 } |
