Add a public RevCommit.parse() method
Callers might have a canonical commit encoding on hand that they wish to convert into a clean structure for presentation purposes, and the object may not be available in a repository. (E.g. maybe its a "draft" commit being written in an editor.) Change-Id: I21759cff337cbbb34dbdde91aec5aa4448a1ef37 Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
707912b35d
commit
b205597b91
|
@ -44,9 +44,12 @@
|
|||
package org.eclipse.jgit.revwalk;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import org.eclipse.jgit.lib.Commit;
|
||||
import org.eclipse.jgit.lib.Constants;
|
||||
import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.lib.ObjectInserter;
|
||||
import org.eclipse.jgit.lib.PersonIdent;
|
||||
import org.eclipse.jgit.lib.RepositoryTestCase;
|
||||
|
||||
|
@ -315,6 +318,24 @@ public void testParse_GitStyleMessage() throws Exception {
|
|||
assertEquals(shortMsg, c.getShortMessage());
|
||||
}
|
||||
|
||||
public void testParse_PublicParseMethod()
|
||||
throws UnsupportedEncodingException {
|
||||
ObjectInserter.Formatter fmt = new ObjectInserter.Formatter();
|
||||
Commit src = new Commit();
|
||||
src.setTreeId(fmt.idFor(Constants.OBJ_TREE, new byte[] {}));
|
||||
src.setAuthor(author);
|
||||
src.setCommitter(committer);
|
||||
src.setMessage("Test commit\n\nThis is a test.\n");
|
||||
|
||||
RevCommit p = RevCommit.parse(fmt.format(src));
|
||||
assertEquals(src.getTreeId(), p.getTree());
|
||||
assertEquals(0, p.getParentCount());
|
||||
assertEquals(author, p.getAuthorIdent());
|
||||
assertEquals(committer, p.getCommitterIdent());
|
||||
assertEquals("Test commit", p.getShortMessage());
|
||||
assertEquals(src.getMessage(), p.getFullMessage());
|
||||
}
|
||||
|
||||
private static ObjectId id(final String str) {
|
||||
return ObjectId.fromString(str);
|
||||
}
|
||||
|
|
|
@ -55,11 +55,59 @@
|
|||
import org.eclipse.jgit.lib.AnyObjectId;
|
||||
import org.eclipse.jgit.lib.Constants;
|
||||
import org.eclipse.jgit.lib.MutableObjectId;
|
||||
import org.eclipse.jgit.lib.ObjectInserter;
|
||||
import org.eclipse.jgit.lib.ObjectReader;
|
||||
import org.eclipse.jgit.lib.PersonIdent;
|
||||
import org.eclipse.jgit.util.RawParseUtils;
|
||||
|
||||
/** A commit reference to a commit in the DAG. */
|
||||
public class RevCommit extends RevObject {
|
||||
/**
|
||||
* Parse a commit from its canonical format.
|
||||
*
|
||||
* This method constructs a temporary revision pool, parses the commit as
|
||||
* supplied, and returns it to the caller. Since the commit was built inside
|
||||
* of a private revision pool its parent pointers will be initialized, but
|
||||
* will not have their headers loaded.
|
||||
*
|
||||
* Applications are discouraged from using this API. Callers usually need
|
||||
* more than one commit. Use {@link RevWalk#parseCommit(AnyObjectId)} to
|
||||
* obtain a RevCommit from an existing repository.
|
||||
*
|
||||
* @param raw
|
||||
* the canonical formatted commit to be parsed.
|
||||
* @return the parsed commit, in an isolated revision pool that is not
|
||||
* available to the caller.
|
||||
*/
|
||||
public static RevCommit parse(byte[] raw) {
|
||||
return parse(new RevWalk((ObjectReader) null), raw);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a commit from its canonical format.
|
||||
*
|
||||
* This method inserts the commit directly into the caller supplied revision
|
||||
* pool, making it appear as though the commit exists in the repository,
|
||||
* even if it doesn't. The repository under the pool is not affected.
|
||||
*
|
||||
* @param rw
|
||||
* the revision pool to allocate the commit within. The commit's
|
||||
* tree and parent pointers will be obtained from this pool.
|
||||
* @param raw
|
||||
* the canonical formatted commit to be parsed.
|
||||
* @return the parsed commit, in an isolated revision pool that is not
|
||||
* available to the caller.
|
||||
*/
|
||||
public static RevCommit parse(RevWalk rw, byte[] raw) {
|
||||
ObjectInserter.Formatter fmt = new ObjectInserter.Formatter();
|
||||
boolean retain = rw.isRetainBody();
|
||||
rw.setRetainBody(true);
|
||||
RevCommit r = rw.lookupCommit(fmt.idFor(Constants.OBJ_COMMIT, raw));
|
||||
r.parseCanonical(rw, raw);
|
||||
rw.setRetainBody(retain);
|
||||
return r;
|
||||
}
|
||||
|
||||
static final RevCommit[] NO_PARENTS = {};
|
||||
|
||||
private RevTree tree;
|
||||
|
|
Loading…
Reference in New Issue