comparison src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 403:2747b0723867

FIXMEs: work on exceptions and javadoc
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Mon, 05 Mar 2012 14:50:51 +0100
parents 0ae53c32ecef
children 866fc3b597a0
comparison
equal deleted inserted replaced
402:1fcc7f7b6d65 403:2747b0723867
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.repo; 17 package org.tmatesoft.hg.repo;
18 18
19 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; 19 import static org.tmatesoft.hg.repo.HgRepository.*;
20 import static org.tmatesoft.hg.repo.HgRepository.TIP;
21 20
22 import java.util.Collection; 21 import java.util.Collection;
23 import java.util.Collections; 22 import java.util.Collections;
24 import java.util.LinkedHashMap; 23 import java.util.LinkedHashMap;
25 import java.util.LinkedList; 24 import java.util.LinkedList;
28 import java.util.TreeSet; 27 import java.util.TreeSet;
29 28
30 import org.tmatesoft.hg.core.HgBadStateException; 29 import org.tmatesoft.hg.core.HgBadStateException;
31 import org.tmatesoft.hg.core.HgException; 30 import org.tmatesoft.hg.core.HgException;
32 import org.tmatesoft.hg.core.HgInvalidControlFileException; 31 import org.tmatesoft.hg.core.HgInvalidControlFileException;
32 import org.tmatesoft.hg.core.HgInvalidRevisionException;
33 import org.tmatesoft.hg.core.Nodeid; 33 import org.tmatesoft.hg.core.Nodeid;
34 import org.tmatesoft.hg.internal.IntMap; 34 import org.tmatesoft.hg.internal.IntMap;
35 import org.tmatesoft.hg.internal.ManifestRevision; 35 import org.tmatesoft.hg.internal.ManifestRevision;
36 import org.tmatesoft.hg.internal.Pool; 36 import org.tmatesoft.hg.internal.Pool;
37 import org.tmatesoft.hg.util.Path; 37 import org.tmatesoft.hg.util.Path;
182 public void setScope(Path.Matcher scopeMatcher) { 182 public void setScope(Path.Matcher scopeMatcher) {
183 // do not assign null, ever 183 // do not assign null, ever
184 scope = scopeMatcher == null ? new Path.Matcher.Any() : scopeMatcher; 184 scope = scopeMatcher == null ? new Path.Matcher.Any() : scopeMatcher;
185 } 185 }
186 186
187 // hg status --change <rev> 187 /**
188 public void change(int rev, HgStatusInspector inspector) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { 188 * 'hg status --change REV' command counterpart.
189 *
190 * @throws HgInvalidRevisionException if argument specifies non-existent revision index
191 * @throws HgInvalidControlFileException if access to revlog index/data entry failed
192 */
193 public void change(int revisionIndex, HgStatusInspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException {
189 int[] parents = new int[2]; 194 int[] parents = new int[2];
190 repo.getChangelog().parents(rev, parents, null, null); 195 repo.getChangelog().parents(revisionIndex, parents, null, null);
191 walk(parents[0], rev, inspector); 196 walk(parents[0], revisionIndex, inspector);
192 } 197 }
193 198
194 // rev1 and rev2 are changelog revision numbers, argument order matters. 199 /**
195 // Either rev1 or rev2 may be -1 to indicate comparison to empty repository (XXX this is due to use of 200 * Parameters <b>rev1</b> and <b>rev2</b> are changelog revision indexes, shall not be the same. Argument order matters.
196 // parents in #change(), I believe. Perhaps, need a constant for this? Otherwise this hidden knowledge gets 201 * FIXME Either rev1 or rev2 may be -1 to indicate comparison to empty repository (this is due to use of
197 // exposed to e.g. Record 202 * parents in #change(), I believe. Perhaps, need a constant for this? Otherwise this hidden knowledge gets
198 public void walk(int rev1, int rev2, HgStatusInspector inspector) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { 203 * exposed to e.g. Record
204 * XXX cancellation?
205 *
206 * @param rev1 <em>from</em> changeset index, non-negative or {@link HgRepository#TIP}
207 * @param rev2 <em>to</em> changeset index, non-negative or {@link HgRepository#TIP}
208 * @param inspector callback for status information
209 * @throws HgInvalidRevisionException if any argument specifies non-existent revision index
210 * @throws IllegalArgumentException inspector other incorrect argument values
211 * @throws HgInvalidControlFileException if access to revlog index/data entry failed
212 */
213 public void walk(int rev1, int rev2, HgStatusInspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException {
199 if (rev1 == rev2) { 214 if (rev1 == rev2) {
200 throw new IllegalArgumentException(); 215 throw new IllegalArgumentException();
201 } 216 }
202 if (inspector == null) { 217 if (inspector == null) {
203 throw new IllegalArgumentException(); 218 throw new IllegalArgumentException();
204 } 219 }
205 final int lastManifestRevision = repo.getChangelog().getLastRevision(); 220 final int lastChangelogRevision = repo.getChangelog().getLastRevision();
206 if (rev1 == TIP) { 221 if (rev1 == TIP) {
207 rev1 = lastManifestRevision; 222 rev1 = lastChangelogRevision;
208 } 223 }
209 if (rev2 == TIP) { 224 if (rev2 == TIP) {
210 rev2 = lastManifestRevision; 225 rev2 = lastChangelogRevision;
226 }
227 if (rev1 != -1 && (HgInternals.wrongRevisionIndex(rev1) || rev1 == WORKING_COPY || rev1 == BAD_REVISION || rev1 > lastChangelogRevision)) {
228 throw new HgInvalidRevisionException(rev1);
229 }
230 if (rev2 != -1 && (HgInternals.wrongRevisionIndex(rev2) || rev2 == WORKING_COPY || rev2 == BAD_REVISION || rev2 > lastChangelogRevision)) {
231 throw new HgInvalidRevisionException(rev2);
211 } 232 }
212 if (inspector instanceof Record) { 233 if (inspector instanceof Record) {
213 ((Record) inspector).init(rev1, rev2, this); 234 ((Record) inspector).init(rev1, rev2, this);
214 } 235 }
215 // in fact, rev1 and rev2 are often next (or close) to each other, 236 // in fact, rev1 and rev2 are often next (or close) to each other,
231 // read with neighbors to save potential subsequent calls for neighboring elements 252 // read with neighbors to save potential subsequent calls for neighboring elements
232 // XXX perhaps, if revlog.baseRevision is cheap, shall expand minRev up to baseRevision 253 // XXX perhaps, if revlog.baseRevision is cheap, shall expand minRev up to baseRevision
233 // which going to be read anyway 254 // which going to be read anyway
234 if (need1) { 255 if (need1) {
235 minRev = rev1; 256 minRev = rev1;
236 maxRev = rev1 < lastManifestRevision-5 ? rev1+5 : lastManifestRevision; 257 maxRev = rev1 < lastChangelogRevision-5 ? rev1+5 : lastChangelogRevision;
237 initCacheRange(minRev, maxRev); 258 initCacheRange(minRev, maxRev);
238 } 259 }
239 if (need2) { 260 if (need2) {
240 minRev = rev2; 261 minRev = rev2;
241 maxRev = rev2 < lastManifestRevision-5 ? rev2+5 : lastManifestRevision; 262 maxRev = rev2 < lastChangelogRevision-5 ? rev2+5 : lastChangelogRevision;
242 initCacheRange(minRev, maxRev); 263 initCacheRange(minRev, maxRev);
243 } 264 }
244 } 265 }
245 r1 = get(rev1); 266 r1 = get(rev1);
246 r2 = get(rev2); 267 r2 = get(rev2);
281 inspector.removed(r1fname); 302 inspector.removed(r1fname);
282 } 303 }
283 } 304 }
284 } 305 }
285 306
286 public Record status(int rev1, int rev2) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { 307 /**
308 * Collects status between two revisions, changes from <b>rev1</b> up to <b>rev2</b>.
309 *
310 * @param rev1 <em>from</em> changeset index
311 * @param rev2 <em>to</em> changeset index
312 * @return information object that describes change between the revisions
313 * @throws HgInvalidRevisionException if any argument specifies non-existent revision index
314 * @throws HgInvalidControlFileException if access to revlog index/data entry failed
315 */
316 public Record status(int rev1, int rev2) throws HgInvalidRevisionException, HgInvalidControlFileException {
287 Record rv = new Record(); 317 Record rv = new Record();
288 walk(rev1, rev2, rv); 318 walk(rev1, rev2, rv);
289 return rv; 319 return rv;
290 } 320 }
291 321