Mercurial > hg4j
diff 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 |
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/repo/HgStatusCollector.java Mon Feb 27 19:38:44 2012 +0100 +++ b/src/org/tmatesoft/hg/repo/HgStatusCollector.java Mon Mar 05 14:50:51 2012 +0100 @@ -16,8 +16,7 @@ */ package org.tmatesoft.hg.repo; -import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; -import static org.tmatesoft.hg.repo.HgRepository.TIP; +import static org.tmatesoft.hg.repo.HgRepository.*; import java.util.Collection; import java.util.Collections; @@ -30,6 +29,7 @@ import org.tmatesoft.hg.core.HgBadStateException; import org.tmatesoft.hg.core.HgException; import org.tmatesoft.hg.core.HgInvalidControlFileException; +import org.tmatesoft.hg.core.HgInvalidRevisionException; import org.tmatesoft.hg.core.Nodeid; import org.tmatesoft.hg.internal.IntMap; import org.tmatesoft.hg.internal.ManifestRevision; @@ -184,30 +184,51 @@ scope = scopeMatcher == null ? new Path.Matcher.Any() : scopeMatcher; } - // hg status --change <rev> - public void change(int rev, HgStatusInspector inspector) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { + /** + * 'hg status --change REV' command counterpart. + * + * @throws HgInvalidRevisionException if argument specifies non-existent revision index + * @throws HgInvalidControlFileException if access to revlog index/data entry failed + */ + public void change(int revisionIndex, HgStatusInspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException { int[] parents = new int[2]; - repo.getChangelog().parents(rev, parents, null, null); - walk(parents[0], rev, inspector); + repo.getChangelog().parents(revisionIndex, parents, null, null); + walk(parents[0], revisionIndex, inspector); } - // rev1 and rev2 are changelog revision numbers, argument order matters. - // Either rev1 or rev2 may be -1 to indicate comparison to empty repository (XXX this is due to use of - // parents in #change(), I believe. Perhaps, need a constant for this? Otherwise this hidden knowledge gets - // exposed to e.g. Record - public void walk(int rev1, int rev2, HgStatusInspector inspector) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { + /** + * Parameters <b>rev1</b> and <b>rev2</b> are changelog revision indexes, shall not be the same. Argument order matters. + * FIXME Either rev1 or rev2 may be -1 to indicate comparison to empty repository (this is due to use of + * parents in #change(), I believe. Perhaps, need a constant for this? Otherwise this hidden knowledge gets + * exposed to e.g. Record + * XXX cancellation? + * + * @param rev1 <em>from</em> changeset index, non-negative or {@link HgRepository#TIP} + * @param rev2 <em>to</em> changeset index, non-negative or {@link HgRepository#TIP} + * @param inspector callback for status information + * @throws HgInvalidRevisionException if any argument specifies non-existent revision index + * @throws IllegalArgumentException inspector other incorrect argument values + * @throws HgInvalidControlFileException if access to revlog index/data entry failed + */ + public void walk(int rev1, int rev2, HgStatusInspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException { if (rev1 == rev2) { throw new IllegalArgumentException(); } if (inspector == null) { throw new IllegalArgumentException(); } - final int lastManifestRevision = repo.getChangelog().getLastRevision(); + final int lastChangelogRevision = repo.getChangelog().getLastRevision(); if (rev1 == TIP) { - rev1 = lastManifestRevision; + rev1 = lastChangelogRevision; } if (rev2 == TIP) { - rev2 = lastManifestRevision; + rev2 = lastChangelogRevision; + } + if (rev1 != -1 && (HgInternals.wrongRevisionIndex(rev1) || rev1 == WORKING_COPY || rev1 == BAD_REVISION || rev1 > lastChangelogRevision)) { + throw new HgInvalidRevisionException(rev1); + } + if (rev2 != -1 && (HgInternals.wrongRevisionIndex(rev2) || rev2 == WORKING_COPY || rev2 == BAD_REVISION || rev2 > lastChangelogRevision)) { + throw new HgInvalidRevisionException(rev2); } if (inspector instanceof Record) { ((Record) inspector).init(rev1, rev2, this); @@ -233,12 +254,12 @@ // which going to be read anyway if (need1) { minRev = rev1; - maxRev = rev1 < lastManifestRevision-5 ? rev1+5 : lastManifestRevision; + maxRev = rev1 < lastChangelogRevision-5 ? rev1+5 : lastChangelogRevision; initCacheRange(minRev, maxRev); } if (need2) { minRev = rev2; - maxRev = rev2 < lastManifestRevision-5 ? rev2+5 : lastManifestRevision; + maxRev = rev2 < lastChangelogRevision-5 ? rev2+5 : lastChangelogRevision; initCacheRange(minRev, maxRev); } } @@ -283,7 +304,16 @@ } } - public Record status(int rev1, int rev2) throws /*FIXME HInvalidRevisionException,*/ HgInvalidControlFileException { + /** + * Collects status between two revisions, changes from <b>rev1</b> up to <b>rev2</b>. + * + * @param rev1 <em>from</em> changeset index + * @param rev2 <em>to</em> changeset index + * @return information object that describes change between the revisions + * @throws HgInvalidRevisionException if any argument specifies non-existent revision index + * @throws HgInvalidControlFileException if access to revlog index/data entry failed + */ + public Record status(int rev1, int rev2) throws HgInvalidRevisionException, HgInvalidControlFileException { Record rv = new Record(); walk(rev1, rev2, rv); return rv;