*
* @param content
* binary file content.
- * @return reference to the blob.
+ * @return the new, fully parsed blob.
* @throws Exception
*/
public RevBlob blob(byte[] content) throws Exception {
id = ins.insert(Constants.OBJ_BLOB, content);
ins.flush();
}
- return pool.lookupBlob(id);
+ return (RevBlob) pool.parseAny(id);
}
/**
* @param entries
* the files to include in the tree. The collection does not need
* to be sorted properly and may be empty.
- * @return reference to the tree specified by the entry list.
+ * @return the new, fully parsed tree specified by the entry list.
* @throws Exception
*/
public RevTree tree(DirCacheEntry... entries) throws Exception {
final DirCache dc = DirCache.newInCore();
final DirCacheBuilder b = dc.builder();
- for (DirCacheEntry e : entries)
+ for (DirCacheEntry e : entries) {
b.add(e);
+ }
b.finish();
ObjectId root;
try (ObjectInserter ins = inserter) {
root = dc.writeTree(ins);
ins.flush();
}
- return pool.lookupTree(root);
+ return pool.parseTree(root);
}
/**
* the root tree for the commit.
* @param parents
* zero or more parents of the commit.
- * @return the new commit.
+ * @return the new, fully parsed commit.
* @throws Exception
*/
public RevCommit commit(final int secDelta, final RevTree tree,
id = ins.insert(c);
ins.flush();
}
- return pool.lookupCommit(id);
+ return pool.parseCommit(id);
}
/**
* with {@code refs/tags/}.
* @param dst
* object the tag should be pointed at.
- * @return the annotated tag object.
+ * @return the new, fully parsed annotated tag object.
* @throws Exception
*/
public RevTag tag(String name, RevObject dst) throws Exception {
id = ins.insert(t);
ins.flush();
}
- return (RevTag) pool.lookupAny(id, Constants.OBJ_TAG);
+ return pool.parseTag(id);
}
/**
*
* @param id
* commit-ish to cherry-pick.
- * @return newly created commit, or null if no work was done due to the
- * resulting tree being identical.
+ * @return the new, fully parsed commit, or null if no work was done due to
+ * the resulting tree being identical.
* @throws Exception
*/
public RevCommit cherryPick(AnyObjectId id) throws Exception {
commitId = ins.insert(c);
ins.flush();
}
- self = pool.lookupCommit(commitId);
+ self = pool.parseCommit(commitId);
if (branch != null)
branch.update(self);
@Test
public void testDepth1() throws Exception {
- final RevCommit a = commit();
- final RevCommit b = commit(a);
- final RevCommit c = commit(b);
- final RevCommit d = commit(c);
+ RevCommit[] commits = setupLinearChain();
- createShallowFile(d);
+ createShallowFile(commits[3]);
+ updateCommits(commits);
- rw.reset();
- markStart(d);
- assertCommit(d, rw.next());
+ rw.markStart(commits[3]);
+ assertCommit(commits[3], rw.next());
assertNull(rw.next());
}
@Test
public void testDepth2() throws Exception {
- final RevCommit a = commit();
- final RevCommit b = commit(a);
- final RevCommit c = commit(b);
- final RevCommit d = commit(c);
+ RevCommit[] commits = setupLinearChain();
- createShallowFile(c);
+ createShallowFile(commits[2]);
+ updateCommits(commits);
- rw.reset();
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
+ rw.markStart(commits[3]);
+ assertCommit(commits[3], rw.next());
+ assertCommit(commits[2], rw.next());
assertNull(rw.next());
}
@Test
public void testDepth3() throws Exception {
- final RevCommit a = commit();
- final RevCommit b = commit(a);
- final RevCommit c = commit(b);
- final RevCommit d = commit(c);
+ RevCommit[] commits = setupLinearChain();
- createShallowFile(b);
+ createShallowFile(commits[1]);
+ updateCommits(commits);
- rw.reset();
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- assertCommit(b, rw.next());
+ rw.markStart(commits[3]);
+ assertCommit(commits[3], rw.next());
+ assertCommit(commits[2], rw.next());
+ assertCommit(commits[1], rw.next());
assertNull(rw.next());
}
@Test
- public void testMergeCommitOneParentShallow() throws Exception {
- final RevCommit a = commit();
- final RevCommit b = commit(a);
- final RevCommit c = commit(b);
- final RevCommit d = commit(b);
- final RevCommit e = commit(d);
- final RevCommit merge = commit(c, e);
-
- createShallowFile(e);
-
- rw.reset();
- markStart(merge);
- assertCommit(merge, rw.next());
- assertCommit(e, rw.next());
- assertCommit(c, rw.next());
- assertCommit(b, rw.next());
- assertCommit(a, rw.next());
+ public void testObjectDirectorySnapshot() throws Exception {
+ RevCommit[] commits = setupLinearChain();
+
+ createShallowFile(commits[3]);
+ updateCommits(commits);
+
+ markStart(commits[3]);
+ assertCommit(commits[3], rw.next());
+ assertNull(rw.next());
+
+ createShallowFile(commits[2]);
+ updateCommits(commits);
+
+ markStart(commits[3]);
+ assertCommit(commits[3], rw.next());
+ assertCommit(commits[2], rw.next());
assertNull(rw.next());
}
+ private RevCommit[] setupLinearChain() throws Exception {
+ RevCommit[] commits = new RevCommit[4];
+ RevCommit parent = null;
+ for (int i = 0; i < commits.length; i++) {
+ commits[i] = parent != null ? commit(parent) : commit();
+ parent = commits[i];
+ }
+ return commits;
+ }
+
@Test
- public void testMergeCommitEntirelyShallow() throws Exception {
- final RevCommit a = commit();
- final RevCommit b = commit(a);
- final RevCommit c = commit(b);
- final RevCommit d = commit(b);
- final RevCommit e = commit(d);
- final RevCommit merge = commit(c, e);
-
- createShallowFile(c, e);
-
- rw.reset();
- markStart(merge);
- assertCommit(merge, rw.next());
- assertCommit(e, rw.next());
- assertCommit(c, rw.next());
+ public void testMergeCommitOneParentShallow() throws Exception {
+ RevCommit[] commits = setupMergeChain();
+
+ createShallowFile(commits[4]);
+ updateCommits(commits);
+
+ markStart(commits[5]);
+ assertCommit(commits[5], rw.next());
+ assertCommit(commits[4], rw.next());
+ assertCommit(commits[2], rw.next());
+ assertCommit(commits[1], rw.next());
+ assertCommit(commits[0], rw.next());
assertNull(rw.next());
}
@Test
- public void testObjectDirectorySnapshot() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(a);
- RevCommit c = commit(b);
- RevCommit d = commit(c);
+ public void testMergeCommitEntirelyShallow() throws Exception {
+ RevCommit[] commits = setupMergeChain();
- createShallowFile(d);
+ createShallowFile(commits[2], commits[4]);
+ updateCommits(commits);
- rw.reset();
- markStart(d);
- assertCommit(d, rw.next());
+ markStart(commits[5]);
+ assertCommit(commits[5], rw.next());
+ assertCommit(commits[4], rw.next());
+ assertCommit(commits[2], rw.next());
assertNull(rw.next());
+ }
- rw = createRevWalk();
- a = rw.lookupCommit(a);
- b = rw.lookupCommit(b);
- c = rw.lookupCommit(c);
- d = rw.lookupCommit(d);
-
- rw.reset();
- markStart(d);
- assertCommit(d, rw.next());
- assertNull(rw.next());
+ private RevCommit[] setupMergeChain() throws Exception {
+ /*-
+ * Create a history like this, diverging at 1 and merging at 5:
+ *
+ * ---o--o commits 3,4
+ * / \
+ * o--o--o------o commits 0,1,2,5
+ */
+ RevCommit[] commits = new RevCommit[6];
+ commits[0] = commit();
+ commits[1] = commit(commits[0]);
+ commits[2] = commit(commits[1]);
+ commits[3] = commit(commits[1]);
+ commits[4] = commit(commits[3]);
+ commits[5] = commit(commits[2], commits[4]);
+ return commits;
+ }
- createShallowFile(c);
+ private void updateCommits(RevCommit[] commits) {
+ // Relookup commits using the new RevWalk
+ for (int i = 0; i < commits.length; i++) {
+ commits[i] = rw.lookupCommit(commits[i].getId());
+ }
+ }
+ private void createShallowFile(ObjectId... shallowCommits)
+ throws IOException {
+ // Reset the RevWalk since the new shallow file invalidates the existing
+ // RevWalk's shallow state.
+ rw.close();
rw = createRevWalk();
- a = rw.lookupCommit(a);
- b = rw.lookupCommit(b);
- c = rw.lookupCommit(c);
- d = rw.lookupCommit(d);
-
- rw.reset();
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- assertNull(rw.next());
+ StringBuilder builder = new StringBuilder();
+ for (ObjectId commit : shallowCommits) {
+ builder.append(commit.getName() + "\n");
+ }
+ JGitTestUtil.write(new File(db.getDirectory(), "shallow"),
+ builder.toString());
}
@Test
assertCommit(b, rw.next());
assertNull(rw.next());
}
-
- private void createShallowFile(ObjectId... shallowCommits)
- throws IOException {
- final StringBuilder builder = new StringBuilder();
- for (ObjectId commit : shallowCommits)
- builder.append(commit.getName() + "\n");
- JGitTestUtil.write(new File(db.getDirectory(), "shallow"),
- builder.toString());
- }
}