Mercurial > hg4j
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 |