Mercurial > hg4j
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 67:64bddc2dcc0e | 68:0e499fed9b3d |
|---|---|
| 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@svnkit.com | 15 * contact TMate Software at support@svnkit.com |
| 16 */ | 16 */ |
| 17 package org.tmatesoft.hg.core; | 17 package org.tmatesoft.hg.core; |
| 18 | 18 |
| 19 import static com.tmate.hgkit.ll.HgRepository.BAD_REVISION; | |
| 20 import static com.tmate.hgkit.ll.HgRepository.TIP; | |
| 21 import static com.tmate.hgkit.ll.HgRepository.WORKING_COPY; | |
| 22 | |
| 19 import org.tmatesoft.hg.core.Path.Matcher; | 23 import org.tmatesoft.hg.core.Path.Matcher; |
| 24 import org.tmatesoft.hg.util.PathPool; | |
| 20 | 25 |
| 26 import com.tmate.hgkit.fs.FileWalker; | |
| 21 import com.tmate.hgkit.ll.HgRepository; | 27 import com.tmate.hgkit.ll.HgRepository; |
| 28 import com.tmate.hgkit.ll.LocalHgRepo; | |
| 29 import com.tmate.hgkit.ll.StatusCollector; | |
| 30 import com.tmate.hgkit.ll.WorkingCopyStatusCollector; | |
| 31 import com.tmate.hgkit.ll.StatusCollector.Record; | |
| 22 | 32 |
| 23 /** | 33 /** |
| 24 * | 34 * |
| 25 * @author Artem Tikhomirov | 35 * @author Artem Tikhomirov |
| 26 * @author TMate Software Ltd. | 36 * @author TMate Software Ltd. |
| 27 */ | 37 */ |
| 28 public class StatusCommand { | 38 public class StatusCommand { |
| 29 private final HgRepository repo; | 39 private final HgRepository repo; |
| 30 | 40 |
| 31 private boolean needClean = false; | 41 private boolean needModified; |
| 32 private boolean needIgnored = false; | 42 private boolean needAdded; |
| 43 private boolean needRemoved; | |
| 44 private boolean needUnknown; | |
| 45 private boolean needMissing; | |
| 46 private boolean needClean; | |
| 47 private boolean needIgnored; | |
| 33 private Matcher matcher; | 48 private Matcher matcher; |
| 34 private int startRevision; | 49 private int startRevision = TIP; |
| 35 private Integer endRevision; // need three states, set, -1 or actual rev number | 50 private int endRevision = WORKING_COPY; |
| 36 private boolean visitSubRepo = true; | 51 private boolean visitSubRepo = true; |
| 37 | 52 |
| 38 public StatusCommand(HgRepository hgRepo) { | 53 public StatusCommand(HgRepository hgRepo) { |
| 39 this.repo = hgRepo; | 54 repo = hgRepo; |
| 55 defaults(); | |
| 40 } | 56 } |
| 41 | 57 |
| 42 public StatusCommand all() { | 58 public StatusCommand defaults() { |
| 43 needClean = true; | 59 needModified = needAdded = needRemoved = needUnknown = needMissing = true; |
| 60 needClean = needIgnored = false; | |
| 44 return this; | 61 return this; |
| 45 } | 62 } |
| 63 public StatusCommand all() { | |
| 64 needModified = needAdded = needRemoved = needUnknown = needMissing = true; | |
| 65 needClean = needIgnored = true; | |
| 66 return this; | |
| 67 } | |
| 68 | |
| 46 | 69 |
| 70 public StatusCommand modified(boolean include) { | |
| 71 needModified = include; | |
| 72 return this; | |
| 73 } | |
| 74 public StatusCommand added(boolean include) { | |
| 75 needAdded = include; | |
| 76 return this; | |
| 77 } | |
| 78 public StatusCommand removed(boolean include) { | |
| 79 needRemoved = include; | |
| 80 return this; | |
| 81 } | |
| 82 public StatusCommand deleted(boolean include) { | |
| 83 needMissing = include; | |
| 84 return this; | |
| 85 } | |
| 86 public StatusCommand unknown(boolean include) { | |
| 87 needUnknown = include; | |
| 88 return this; | |
| 89 } | |
| 47 public StatusCommand clean(boolean include) { | 90 public StatusCommand clean(boolean include) { |
| 48 needClean = include; | 91 needClean = include; |
| 49 return this; | 92 return this; |
| 50 } | 93 } |
| 51 public StatusCommand ignored(boolean include) { | 94 public StatusCommand ignored(boolean include) { |
| 52 needIgnored = include; | 95 needIgnored = include; |
| 53 return this; | 96 return this; |
| 54 } | 97 } |
| 55 | 98 |
| 56 // if set, either base:revision or base:workingdir | 99 /** |
| 100 * if set, either base:revision or base:workingdir | |
| 101 * to unset, pass {@link HgRepository#TIP} or {@link HgRepository#BAD_REVISION} | |
| 102 * @param revision | |
| 103 * @return | |
| 104 */ | |
| 105 | |
| 57 public StatusCommand base(int revision) { | 106 public StatusCommand base(int revision) { |
| 107 if (revision == WORKING_COPY) { | |
| 108 throw new IllegalArgumentException(); | |
| 109 } | |
| 110 if (revision == BAD_REVISION) { | |
| 111 revision = TIP; | |
| 112 } | |
| 58 startRevision = revision; | 113 startRevision = revision; |
| 59 return this; | 114 return this; |
| 60 } | 115 } |
| 61 | 116 |
| 62 // revision without base == --change | 117 /** |
| 118 * Revision without base == --change | |
| 119 * Pass {@link HgRepository#WORKING_COPY} or {@link HgRepository#BAD_REVISION} to reset | |
| 120 * @param revision | |
| 121 * @return | |
| 122 */ | |
| 63 public StatusCommand revision(int revision) { | 123 public StatusCommand revision(int revision) { |
| 64 // XXX how to clear endRevision, if needed. | 124 if (revision == BAD_REVISION) { |
| 65 // Perhaps, use of WC_REVISION or BAD_REVISION == -2 or Int.MIN_VALUE? | 125 revision = WORKING_COPY; |
| 66 endRevision = new Integer(revision); | 126 } |
| 127 // XXX negative values, except for predefined constants, shall throw IAE. | |
| 128 endRevision = revision; | |
| 67 return this; | 129 return this; |
| 68 } | 130 } |
| 69 | 131 |
| 70 public StatusCommand match(Path.Matcher pathMatcher) { | 132 public StatusCommand match(Path.Matcher pathMatcher) { |
| 71 matcher = pathMatcher; | 133 matcher = pathMatcher; |
| 75 public StatusCommand subrepo(boolean visit) { | 137 public StatusCommand subrepo(boolean visit) { |
| 76 visitSubRepo = visit; | 138 visitSubRepo = visit; |
| 77 throw HgRepository.notImplemented(); | 139 throw HgRepository.notImplemented(); |
| 78 } | 140 } |
| 79 | 141 |
| 80 public void execute() { | 142 public void execute(StatusCollector.Inspector inspector) { |
| 81 throw HgRepository.notImplemented(); | 143 StatusCollector sc = new StatusCollector(repo); // TODO from CommandContext |
| 144 // StatusCollector.Record r = new StatusCollector.Record(); // XXX use own inspector not to collect entries that | |
| 145 // are not interesting or do not match name | |
| 146 if (endRevision == WORKING_COPY) { | |
| 147 WorkingCopyStatusCollector wcsc = new WorkingCopyStatusCollector(repo, ((LocalHgRepo) repo).createWorkingDirWalker()); | |
| 148 wcsc.setBaseRevisionCollector(sc); | |
| 149 wcsc.walk(startRevision, inspector); | |
| 150 } else { | |
| 151 if (startRevision == TIP) { | |
| 152 sc.change(endRevision, inspector); | |
| 153 } else { | |
| 154 sc.walk(startRevision, endRevision, inspector); | |
| 155 } | |
| 156 } | |
| 157 // PathPool pathHelper = new PathPool(repo.getPathHelper()); // TODO from CommandContext | |
| 82 } | 158 } |
| 83 } | 159 } |
