Mercurial > jhg
diff src/org/tmatesoft/hg/core/StatusCommand.java @ 68:0e499fed9b3d
StatusCommand with tests. Extra constants to indicate common revision cases
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Sat, 22 Jan 2011 22:11:24 +0100 |
parents | 19e9e220bf68 |
children | 6f1b88693d48 |
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/core/StatusCommand.java Fri Jan 21 19:21:43 2011 +0100 +++ b/src/org/tmatesoft/hg/core/StatusCommand.java Sat Jan 22 22:11:24 2011 +0100 @@ -16,9 +16,19 @@ */ package org.tmatesoft.hg.core; +import static com.tmate.hgkit.ll.HgRepository.BAD_REVISION; +import static com.tmate.hgkit.ll.HgRepository.TIP; +import static com.tmate.hgkit.ll.HgRepository.WORKING_COPY; + import org.tmatesoft.hg.core.Path.Matcher; +import org.tmatesoft.hg.util.PathPool; +import com.tmate.hgkit.fs.FileWalker; import com.tmate.hgkit.ll.HgRepository; +import com.tmate.hgkit.ll.LocalHgRepo; +import com.tmate.hgkit.ll.StatusCollector; +import com.tmate.hgkit.ll.WorkingCopyStatusCollector; +import com.tmate.hgkit.ll.StatusCollector.Record; /** * @@ -28,22 +38,55 @@ public class StatusCommand { private final HgRepository repo; - private boolean needClean = false; - private boolean needIgnored = false; + private boolean needModified; + private boolean needAdded; + private boolean needRemoved; + private boolean needUnknown; + private boolean needMissing; + private boolean needClean; + private boolean needIgnored; private Matcher matcher; - private int startRevision; - private Integer endRevision; // need three states, set, -1 or actual rev number + private int startRevision = TIP; + private int endRevision = WORKING_COPY; private boolean visitSubRepo = true; - public StatusCommand(HgRepository hgRepo) { - this.repo = hgRepo; + public StatusCommand(HgRepository hgRepo) { + repo = hgRepo; + defaults(); } - public StatusCommand all() { - needClean = true; + public StatusCommand defaults() { + needModified = needAdded = needRemoved = needUnknown = needMissing = true; + needClean = needIgnored = false; return this; } + public StatusCommand all() { + needModified = needAdded = needRemoved = needUnknown = needMissing = true; + needClean = needIgnored = true; + return this; + } + + public StatusCommand modified(boolean include) { + needModified = include; + return this; + } + public StatusCommand added(boolean include) { + needAdded = include; + return this; + } + public StatusCommand removed(boolean include) { + needRemoved = include; + return this; + } + public StatusCommand deleted(boolean include) { + needMissing = include; + return this; + } + public StatusCommand unknown(boolean include) { + needUnknown = include; + return this; + } public StatusCommand clean(boolean include) { needClean = include; return this; @@ -53,17 +96,36 @@ return this; } - // if set, either base:revision or base:workingdir + /** + * if set, either base:revision or base:workingdir + * to unset, pass {@link HgRepository#TIP} or {@link HgRepository#BAD_REVISION} + * @param revision + * @return + */ + public StatusCommand base(int revision) { + if (revision == WORKING_COPY) { + throw new IllegalArgumentException(); + } + if (revision == BAD_REVISION) { + revision = TIP; + } startRevision = revision; return this; } - // revision without base == --change + /** + * Revision without base == --change + * Pass {@link HgRepository#WORKING_COPY} or {@link HgRepository#BAD_REVISION} to reset + * @param revision + * @return + */ public StatusCommand revision(int revision) { - // XXX how to clear endRevision, if needed. - // Perhaps, use of WC_REVISION or BAD_REVISION == -2 or Int.MIN_VALUE? - endRevision = new Integer(revision); + if (revision == BAD_REVISION) { + revision = WORKING_COPY; + } + // XXX negative values, except for predefined constants, shall throw IAE. + endRevision = revision; return this; } @@ -77,7 +139,21 @@ throw HgRepository.notImplemented(); } - public void execute() { - throw HgRepository.notImplemented(); + public void execute(StatusCollector.Inspector inspector) { + StatusCollector sc = new StatusCollector(repo); // TODO from CommandContext +// StatusCollector.Record r = new StatusCollector.Record(); // XXX use own inspector not to collect entries that + // are not interesting or do not match name + if (endRevision == WORKING_COPY) { + WorkingCopyStatusCollector wcsc = new WorkingCopyStatusCollector(repo, ((LocalHgRepo) repo).createWorkingDirWalker()); + wcsc.setBaseRevisionCollector(sc); + wcsc.walk(startRevision, inspector); + } else { + if (startRevision == TIP) { + sc.change(endRevision, inspector); + } else { + sc.walk(startRevision, endRevision, inspector); + } + } +// PathPool pathHelper = new PathPool(repo.getPathHelper()); // TODO from CommandContext } }