diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java index 6c8014513..97d3f81b9 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkCommitGraphTest.java @@ -83,6 +83,42 @@ public void testParseHeaders() throws Exception { assertArrayEquals(notParseInGraph.getParents(), noBody.getParents()); } + @Test + public void testParseCanonical() throws Exception { + RevCommit c1 = commitFile("file1", "1", "master"); + enableAndWriteCommitGraph(); + + RevCommit notParseInGraph = rw.lookupCommit(c1); + rw.parseHeaders(notParseInGraph); + + reinitializeRevWalk(); + RevCommit parseInGraph = rw.lookupCommit(c1); + parseInGraph.parseCanonical(rw, rw.getCachedBytes(c1)); + + assertTrue(parseInGraph instanceof RevCommitCG); + assertNotNull(parseInGraph.getRawBuffer()); + assertEquals(1, parseInGraph.getGeneration()); + assertEquals(notParseInGraph.getId(), parseInGraph.getId()); + assertEquals(notParseInGraph.getTree(), parseInGraph.getTree()); + assertEquals(notParseInGraph.getCommitTime(), + parseInGraph.getCommitTime()); + assertArrayEquals(notParseInGraph.getParents(), + parseInGraph.getParents()); + + reinitializeRevWalk(); + rw.setRetainBody(false); + RevCommit noBody = rw.lookupCommit(c1); + noBody.parseCanonical(rw, rw.getCachedBytes(c1)); + + assertTrue(noBody instanceof RevCommitCG); + assertNull(noBody.getRawBuffer()); + assertEquals(1, noBody.getGeneration()); + assertEquals(notParseInGraph.getId(), noBody.getId()); + assertEquals(notParseInGraph.getTree(), noBody.getTree()); + assertEquals(notParseInGraph.getCommitTime(), noBody.getCommitTime()); + assertArrayEquals(notParseInGraph.getParents(), noBody.getParents()); + } + @Test public void testInitializeShallowCommits() throws Exception { RevCommit c1 = commit(commit()); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java index e155a2563..b64c9ce90 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommit.java @@ -125,7 +125,15 @@ public static RevCommit parse(RevWalk rw, byte[] raw) throws IOException { int inDegree; - private byte[] buffer; + /** + * Raw unparsed commit body of the commit. Populated only + * after {@link #parseCanonical(RevWalk, byte[])} with + * {@link RevWalk#isRetainBody()} enable or after + * {@link #parseBody(RevWalk)} and {@link #parse(RevWalk, byte[])}. + * + * @since 6.5.1 + */ + protected byte[] buffer; /** * Create a new commit reference. diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java index b68f65b68..4d3664da1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevCommitCG.java @@ -44,10 +44,27 @@ protected RevCommitCG(AnyObjectId id, int graphPosition) { this.graphPosition = graphPosition; } + /** {@inheritDoc} */ + @Override + void parseCanonical(RevWalk walk, byte[] raw) throws IOException { + if (walk.isRetainBody()) { + buffer = raw; + } + parseInGraph(walk); + } + /** {@inheritDoc} */ @Override void parseHeaders(RevWalk walk) throws MissingObjectException, IncorrectObjectTypeException, IOException { + if (walk.isRetainBody()) { + super.parseBody(walk); // This parses header and body + return; + } + parseInGraph(walk); + } + + private void parseInGraph(RevWalk walk) throws IOException { CommitGraph graph = walk.commitGraph(); CommitGraph.CommitData data = graph.getCommitData(graphPosition); if (data == null) { @@ -78,11 +95,7 @@ void parseHeaders(RevWalk walk) throws MissingObjectException, this.parents = pList; } } - flags |= PARSED; - if (walk.isRetainBody()) { - super.parseBody(walk); - } } /** {@inheritDoc} */