From 88530a179e2ddfa81de5cc441a27d66521334608 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 14 Jun 2010 16:53:13 -0700 Subject: [PATCH] Start using ObjectInserter instead of ObjectWriter Some newer style APIs are updated to use the newer ObjectInserter interface instead of the now deprecated ObjectWriter. In many of the unit tests we don't bother to release the inserter, these are typically using the file backend which doesn't need a release, but in the future should use an in-memory HashMap based store, which really wouldn't need it either. Change-Id: I91a15e1dc42da68e6715397814e30fbd87fa2e73 Signed-off-by: Shawn O. Pearce --- .../eclipse/jgit/junit/TestRepository.java | 54 +++++++++-- .../org/eclipse/jgit/lib/ReadTreeTest.java | 8 +- .../eclipse/jgit/merge/CherryPickTest.java | 20 ++-- .../eclipse/jgit/merge/SimpleMergeTest.java | 33 ++++--- .../filter/PathSuffixFilterTestCase.java | 26 +++--- .../org/eclipse/jgit/api/CommitCommand.java | 93 ++++++++++--------- .../org/eclipse/jgit/dircache/DirCache.java | 8 +- .../eclipse/jgit/dircache/DirCacheTree.java | 8 +- .../src/org/eclipse/jgit/lib/Commit.java | 9 +- .../src/org/eclipse/jgit/lib/Tag.java | 11 ++- .../src/org/eclipse/jgit/merge/Merger.java | 12 +-- .../merge/StrategySimpleTwoWayInCore.java | 12 ++- 12 files changed, 187 insertions(+), 107 deletions(-) diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java index 279762ac6..dbf4eaf4c 100644 --- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java +++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/TestRepository.java @@ -79,7 +79,7 @@ import org.eclipse.jgit.lib.ObjectChecker; import org.eclipse.jgit.lib.ObjectDirectory; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.PackFile; import org.eclipse.jgit.lib.PackWriter; import org.eclipse.jgit.lib.PersonIdent; @@ -128,7 +128,7 @@ public class TestRepository { private final RevWalk pool; - private final ObjectWriter writer; + private final ObjectInserter inserter; private long now; @@ -155,7 +155,7 @@ public TestRepository(R db) throws IOException { public TestRepository(R db, RevWalk rw) throws IOException { this.db = db; this.pool = rw; - this.writer = new ObjectWriter(db); + this.inserter = db.newObjectInserter(); this.now = 1236977987000L; } @@ -205,7 +205,14 @@ public RevBlob blob(final String content) throws Exception { * @throws Exception */ public RevBlob blob(final byte[] content) throws Exception { - return pool.lookupBlob(writer.writeBlob(content)); + ObjectId id; + try { + id = inserter.insert(Constants.OBJ_BLOB, content); + inserter.flush(); + } finally { + inserter.release(); + } + return pool.lookupBlob(id); } /** @@ -241,7 +248,14 @@ public RevTree tree(final DirCacheEntry... entries) throws Exception { for (final DirCacheEntry e : entries) b.add(e); b.finish(); - return pool.lookupTree(dc.writeTree(writer)); + ObjectId root; + try { + root = dc.writeTree(inserter); + inserter.flush(); + } finally { + inserter.release(); + } + return pool.lookupTree(root); } /** @@ -351,7 +365,14 @@ public RevCommit commit(final int secDelta, final RevTree tree, c.setAuthor(new PersonIdent(author, new Date(now))); c.setCommitter(new PersonIdent(committer, new Date(now))); c.setMessage(""); - return pool.lookupCommit(writer.writeCommit(c)); + ObjectId id; + try { + id = inserter.insert(Constants.OBJ_COMMIT, inserter.format(c)); + inserter.flush(); + } finally { + inserter.release(); + } + return pool.lookupCommit(id); } /** @return a new commit builder. */ @@ -382,7 +403,14 @@ public RevTag tag(final String name, final RevObject dst) throws Exception { t.setTag(name); t.setTagger(new PersonIdent(committer, new Date(now))); t.setMessage(""); - return (RevTag) pool.lookupAny(writer.writeTag(t), Constants.OBJ_TAG); + ObjectId id; + try { + id = inserter.insert(Constants.OBJ_TAG, inserter.format(t)); + inserter.flush(); + } finally { + inserter.release(); + } + return (RevTag) pool.lookupAny(id, Constants.OBJ_TAG); } /** @@ -777,13 +805,21 @@ public RevCommit create() throws Exception { TestRepository.this.tick(tick); final Commit c = new Commit(db); - c.setTreeId(pool.lookupTree(tree.writeTree(writer))); c.setParentIds(parents.toArray(new RevCommit[parents.size()])); c.setAuthor(new PersonIdent(author, new Date(now))); c.setCommitter(new PersonIdent(committer, new Date(now))); c.setMessage(message); - self = pool.lookupCommit(writer.writeCommit(c)); + ObjectId commitId; + try { + c.setTreeId(tree.writeTree(inserter)); + commitId = inserter.insert(Constants.OBJ_COMMIT, inserter + .format(c)); + inserter.flush(); + } finally { + inserter.release(); + } + self = pool.lookupCommit(commitId); if (branch != null) branch.update(self); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java index e2a356466..e57d0f32f 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ReadTreeTest.java @@ -123,11 +123,15 @@ private Tree buildTree(HashMap headEntries) throws IOException { } ObjectId genSha1(String data) { - ObjectWriter objectWriter = new ObjectWriter(db); + ObjectInserter w = db.newObjectInserter(); try { - return objectWriter.writeBlob(data.getBytes()); + ObjectId id = w.insert(Constants.OBJ_BLOB, data.getBytes()); + w.flush(); + return id; } catch (IOException e) { fail(e.toString()); + } finally { + w.release(); } return null; } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java index 42e653be3..1b4a11db5 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/CherryPickTest.java @@ -44,7 +44,8 @@ package org.eclipse.jgit.merge; -import java.io.ByteArrayInputStream; +import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; +import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheBuilder; @@ -53,7 +54,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.treewalk.TreeWalk; @@ -93,7 +94,7 @@ public void testPick() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId B = commit(ow, treeB, new ObjectId[] {}); final ObjectId O = commit(ow, treeO, new ObjectId[] { B }); final ObjectId P = commit(ow, treeP, new ObjectId[] { B }); @@ -128,15 +129,17 @@ private void assertCorrectId(final DirCache treeT, final TreeWalk tw) { .getObjectId(0)); } - private ObjectId commit(final ObjectWriter ow, final DirCache treeB, + private ObjectId commit(final ObjectInserter odi, final DirCache treeB, final ObjectId[] parentIds) throws Exception { final Commit c = new Commit(db); - c.setTreeId(treeB.writeTree(ow)); + c.setTreeId(treeB.writeTree(odi)); c.setAuthor(new PersonIdent("A U Thor", "a.u.thor", 1L, 0)); c.setCommitter(c.getAuthor()); c.setParentIds(parentIds); c.setMessage("Tree " + c.getTreeId().name()); - return ow.writeCommit(c); + ObjectId id = odi.insert(OBJ_COMMIT, odi.format(c)); + odi.flush(); + return id; } private DirCacheEntry makeEntry(final String path, final FileMode mode) @@ -148,9 +151,8 @@ private DirCacheEntry makeEntry(final String path, final FileMode mode, final String content) throws Exception { final DirCacheEntry ent = new DirCacheEntry(path); ent.setFileMode(mode); - final byte[] contentBytes = Constants.encode(content); - ent.setObjectId(new ObjectWriter(db).computeBlobSha1( - contentBytes.length, new ByteArrayInputStream(contentBytes))); + ent.setObjectId(new ObjectInserter.Formatter().idFor(OBJ_BLOB, + Constants.encode(content))); return ent; } } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java index 690b166cb..a4ef2cd64 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/SimpleMergeTest.java @@ -44,7 +44,9 @@ package org.eclipse.jgit.merge; -import java.io.ByteArrayInputStream; +import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; +import static org.eclipse.jgit.lib.Constants.OBJ_COMMIT; + import java.io.IOException; import org.eclipse.jgit.dircache.DirCache; @@ -54,7 +56,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.SampleDataRepositoryTestCase; import org.eclipse.jgit.treewalk.TreeWalk; @@ -126,7 +128,7 @@ public void testTrivialTwoWay_validSubtreeSort() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId b = commit(ow, treeB, new ObjectId[] {}); final ObjectId o = commit(ow, treeO, new ObjectId[] { b }); final ObjectId t = commit(ow, treeT, new ObjectId[] { b }); @@ -177,7 +179,7 @@ public void testTrivialTwoWay_concurrentSubtreeChange() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId b = commit(ow, treeB, new ObjectId[] {}); final ObjectId o = commit(ow, treeO, new ObjectId[] { b }); final ObjectId t = commit(ow, treeT, new ObjectId[] { b }); @@ -224,7 +226,7 @@ public void testTrivialTwoWay_conflictSubtreeChange() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId b = commit(ow, treeB, new ObjectId[] {}); final ObjectId o = commit(ow, treeO, new ObjectId[] { b }); final ObjectId t = commit(ow, treeT, new ObjectId[] { b }); @@ -256,7 +258,7 @@ public void testTrivialTwoWay_leftDFconflict1() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId b = commit(ow, treeB, new ObjectId[] {}); final ObjectId o = commit(ow, treeO, new ObjectId[] { b }); final ObjectId t = commit(ow, treeT, new ObjectId[] { b }); @@ -288,7 +290,7 @@ public void testTrivialTwoWay_rightDFconflict1() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId b = commit(ow, treeB, new ObjectId[] {}); final ObjectId o = commit(ow, treeO, new ObjectId[] { b }); final ObjectId t = commit(ow, treeT, new ObjectId[] { b }); @@ -318,7 +320,7 @@ public void testTrivialTwoWay_leftDFconflict2() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId b = commit(ow, treeB, new ObjectId[] {}); final ObjectId o = commit(ow, treeO, new ObjectId[] { b }); final ObjectId t = commit(ow, treeT, new ObjectId[] { b }); @@ -348,7 +350,7 @@ public void testTrivialTwoWay_rightDFconflict2() throws Exception { t.finish(); } - final ObjectWriter ow = new ObjectWriter(db); + final ObjectInserter ow = db.newObjectInserter(); final ObjectId b = commit(ow, treeB, new ObjectId[] {}); final ObjectId o = commit(ow, treeO, new ObjectId[] { b }); final ObjectId t = commit(ow, treeT, new ObjectId[] { b }); @@ -363,15 +365,17 @@ private void assertCorrectId(final DirCache treeT, final TreeWalk tw) { .getObjectId(0)); } - private ObjectId commit(final ObjectWriter ow, final DirCache treeB, + private ObjectId commit(final ObjectInserter odi, final DirCache treeB, final ObjectId[] parentIds) throws Exception { final Commit c = new Commit(db); - c.setTreeId(treeB.writeTree(ow)); + c.setTreeId(treeB.writeTree(odi)); c.setAuthor(new PersonIdent("A U Thor", "a.u.thor", 1L, 0)); c.setCommitter(c.getAuthor()); c.setParentIds(parentIds); c.setMessage("Tree " + c.getTreeId().name()); - return ow.writeCommit(c); + ObjectId id = odi.insert(OBJ_COMMIT, odi.format(c)); + odi.flush(); + return id; } private DirCacheEntry makeEntry(final String path, final FileMode mode) @@ -383,9 +387,8 @@ private DirCacheEntry makeEntry(final String path, final FileMode mode, final String content) throws Exception { final DirCacheEntry ent = new DirCacheEntry(path); ent.setFileMode(mode); - final byte[] contentBytes = Constants.encode(content); - ent.setObjectId(new ObjectWriter(db).computeBlobSha1( - contentBytes.length, new ByteArrayInputStream(contentBytes))); + ent.setObjectId(new ObjectInserter.Formatter().idFor(OBJ_BLOB, + Constants.encode(content))); return ent; } } diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTestCase.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTestCase.java index 1aaefc415..ad51ac2dd 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTestCase.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/filter/PathSuffixFilterTestCase.java @@ -43,6 +43,8 @@ package org.eclipse.jgit.treewalk.filter; +import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; + import java.io.IOException; import java.util.LinkedList; import java.util.List; @@ -52,16 +54,16 @@ import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.RepositoryTestCase; import org.eclipse.jgit.treewalk.TreeWalk; public class PathSuffixFilterTestCase extends RepositoryTestCase { public void testNonRecursiveFiltering() throws IOException { - final ObjectWriter ow = new ObjectWriter(db); - final ObjectId aSth = ow.writeBlob("a.sth".getBytes()); - final ObjectId aTxt = ow.writeBlob("a.txt".getBytes()); + final ObjectInserter odi = db.newObjectInserter(); + final ObjectId aSth = odi.insert(OBJ_BLOB, "a.sth".getBytes()); + final ObjectId aTxt = odi.insert(OBJ_BLOB, "a.txt".getBytes()); final DirCache dc = DirCache.read(db); final DirCacheBuilder builder = dc.builder(); final DirCacheEntry aSthEntry = new DirCacheEntry("a.sth"); @@ -73,7 +75,8 @@ public void testNonRecursiveFiltering() throws IOException { builder.add(aSthEntry); builder.add(aTxtEntry); builder.finish(); - final ObjectId treeId = dc.writeTree(ow); + final ObjectId treeId = dc.writeTree(odi); + odi.flush(); final TreeWalk tw = new TreeWalk(db); @@ -92,11 +95,11 @@ public void testNonRecursiveFiltering() throws IOException { } public void testRecursiveFiltering() throws IOException { - final ObjectWriter ow = new ObjectWriter(db); - final ObjectId aSth = ow.writeBlob("a.sth".getBytes()); - final ObjectId aTxt = ow.writeBlob("a.txt".getBytes()); - final ObjectId bSth = ow.writeBlob("b.sth".getBytes()); - final ObjectId bTxt = ow.writeBlob("b.txt".getBytes()); + final ObjectInserter odi = db.newObjectInserter(); + final ObjectId aSth = odi.insert(OBJ_BLOB, "a.sth".getBytes()); + final ObjectId aTxt = odi.insert(OBJ_BLOB, "a.txt".getBytes()); + final ObjectId bSth = odi.insert(OBJ_BLOB, "b.sth".getBytes()); + final ObjectId bTxt = odi.insert(OBJ_BLOB, "b.txt".getBytes()); final DirCache dc = DirCache.read(db); final DirCacheBuilder builder = dc.builder(); final DirCacheEntry aSthEntry = new DirCacheEntry("a.sth"); @@ -116,7 +119,8 @@ public void testRecursiveFiltering() throws IOException { builder.add(bSthEntry); builder.add(bTxtEntry); builder.finish(); - final ObjectId treeId = dc.writeTree(ow); + final ObjectId treeId = dc.writeTree(odi); + odi.flush(); final TreeWalk tw = new TreeWalk(db); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java index eef952e7c..f12c94b33 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/CommitCommand.java @@ -54,13 +54,13 @@ import org.eclipse.jgit.lib.Commit; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefUpdate; -import org.eclipse.jgit.lib.RefUpdate.Result; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryState; +import org.eclipse.jgit.lib.RefUpdate.Result; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; @@ -141,52 +141,59 @@ public RevCommit call() throws NoHeadException, NoMessageException, // lock the index DirCache index = DirCache.lock(repo); try { - ObjectWriter repoWriter = new ObjectWriter(repo); + ObjectInserter odi = repo.newObjectInserter(); + try { + // Write the index as tree to the object database. This may + // fail for example when the index contains unmerged paths + // (unresolved conflicts) + ObjectId indexTreeId = index.writeTree(odi); - // Write the index as tree to the object database. This may fail - // for example when the index contains unmerged pathes - // (unresolved conflicts) - ObjectId indexTreeId = index.writeTree(repoWriter); + // Create a Commit object, populate it and write it + Commit commit = new Commit(repo); + commit.setCommitter(committer); + commit.setAuthor(author); + commit.setMessage(message); - // Create a Commit object, populate it and write it - Commit commit = new Commit(repo); - commit.setCommitter(committer); - commit.setAuthor(author); - commit.setMessage(message); + commit.setParentIds(parents.toArray(new ObjectId[] {})); + commit.setTreeId(indexTreeId); + ObjectId commitId = odi.insert(Constants.OBJ_COMMIT, odi + .format(commit)); + odi.flush(); - commit.setParentIds(parents.toArray(new ObjectId[]{})); - commit.setTreeId(indexTreeId); - ObjectId commitId = repoWriter.writeCommit(commit); + RevCommit revCommit = new RevWalk(repo) + .parseCommit(commitId); + RefUpdate ru = repo.updateRef(Constants.HEAD); + ru.setNewObjectId(commitId); + ru.setRefLogMessage("commit : " + + revCommit.getShortMessage(), false); - RevCommit revCommit = new RevWalk(repo).parseCommit(commitId); - RefUpdate ru = repo.updateRef(Constants.HEAD); - ru.setNewObjectId(commitId); - ru.setRefLogMessage("commit : " + revCommit.getShortMessage(), - false); - - ru.setExpectedOldObjectId(headId); - Result rc = ru.update(); - switch (rc) { - case NEW: - case FAST_FORWARD: - setCallable(false); - if (state == RepositoryState.MERGING_RESOLVED) { - // Commit was successful. Now delete the files - // used for merge commits - new File(repo.getDirectory(), Constants.MERGE_HEAD) - .delete(); - new File(repo.getDirectory(), Constants.MERGE_MSG) - .delete(); + ru.setExpectedOldObjectId(headId); + Result rc = ru.update(); + switch (rc) { + case NEW: + case FAST_FORWARD: + setCallable(false); + if (state == RepositoryState.MERGING_RESOLVED) { + // Commit was successful. Now delete the files + // used for merge commits + new File(repo.getDirectory(), Constants.MERGE_HEAD) + .delete(); + new File(repo.getDirectory(), Constants.MERGE_MSG) + .delete(); + } + return revCommit; + case REJECTED: + case LOCK_FAILURE: + throw new ConcurrentRefUpdateException( + JGitText.get().couldNotLockHEAD, ru.getRef(), + rc); + default: + throw new JGitInternalException(MessageFormat.format( + JGitText.get().updatingRefFailed, + Constants.HEAD, commitId.toString(), rc)); } - return revCommit; - case REJECTED: - case LOCK_FAILURE: - throw new ConcurrentRefUpdateException( - JGitText.get().couldNotLockHEAD, ru.getRef(), rc); - default: - throw new JGitInternalException(MessageFormat.format( - JGitText.get().updatingRefFailed - , Constants.HEAD, commitId.toString(), rc)); + } finally { + odi.release(); } } finally { index.unlock(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java index 99d5d2eda..9ced005a4 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java @@ -66,7 +66,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.LockFile; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.util.IO; import org.eclipse.jgit.util.MutableInteger; @@ -772,7 +772,9 @@ public DirCacheTree getCacheTree(final boolean build) { * Write all index trees to the object store, returning the root tree. * * @param ow - * the writer to use when serializing to the store. + * the writer to use when serializing to the store. The caller is + * responsible for flushing the inserter before trying to use the + * returned tree identity. * @return identity for the root tree. * @throws UnmergedPathException * one or more paths contain higher-order stages (stage > 0), @@ -783,7 +785,7 @@ public DirCacheTree getCacheTree(final boolean build) { * @throws IOException * an unexpected error occurred writing to the object store. */ - public ObjectId writeTree(final ObjectWriter ow) + public ObjectId writeTree(final ObjectInserter ow) throws UnmergedPathException, IOException { return getCacheTree(true).writeTree(sortedEntries, 0, 0, ow); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java index 144b1a6cf..e04b797ab 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheTree.java @@ -57,7 +57,7 @@ import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.util.MutableInteger; import org.eclipse.jgit.util.RawParseUtils; @@ -311,7 +311,7 @@ public String getPathString() { * an unexpected error occurred writing to the object store. */ ObjectId writeTree(final DirCacheEntry[] cache, int cIdx, - final int pathOffset, final ObjectWriter ow) + final int pathOffset, final ObjectInserter ow) throws UnmergedPathException, IOException { if (id == null) { final int endIdx = cIdx + entrySpan; @@ -346,13 +346,13 @@ ObjectId writeTree(final DirCacheEntry[] cache, int cIdx, entryIdx++; } - id = ow.writeCanonicalTree(out.toByteArray()); + id = ow.insert(Constants.OBJ_TREE, out.toByteArray()); } return id; } private int computeSize(final DirCacheEntry[] cache, int cIdx, - final int pathOffset, final ObjectWriter ow) + final int pathOffset, final ObjectInserter ow) throws UnmergedPathException, IOException { final int endIdx = cIdx + entrySpan; int childIdx = 0; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Commit.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Commit.java index 66dd89120..be4818aa5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Commit.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Commit.java @@ -339,7 +339,14 @@ public void setMessage(final String m) { public void commit() throws IOException { if (getCommitId() != null) throw new IllegalStateException(MessageFormat.format(JGitText.get().commitAlreadyExists, getCommitId())); - setCommitId(new ObjectWriter(objdb).writeCommit(this)); + ObjectInserter odi = objdb.getObjectDatabase().newInserter(); + try { + ObjectId id = odi.insert(Constants.OBJ_COMMIT, odi.format(this)); + odi.flush(); + setCommitId(id); + } finally { + odi.release(); + } } public String toString() { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tag.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tag.java index 5b3531eb1..25a06c9c6 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tag.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Tag.java @@ -203,9 +203,14 @@ public void tag() throws IOException { final RefUpdate ru; if (tagger!=null || message!=null || type!=null) { - ObjectId tagid = new ObjectWriter(objdb).writeTag(this); - setTagId(tagid); - id = tagid; + ObjectInserter odi = objdb.newObjectInserter(); + try { + id = odi.insert(Constants.OBJ_TAG, odi.format(this)); + odi.flush(); + setTagId(id); + } finally { + odi.release(); + } } else { id = objId; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java index 38af20fb8..59b826438 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/Merger.java @@ -51,7 +51,7 @@ import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.ObjectId; -import org.eclipse.jgit.lib.ObjectWriter; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.WindowCursor; import org.eclipse.jgit.revwalk.RevCommit; @@ -73,7 +73,7 @@ public abstract class Merger { /** A RevWalk for computing merge bases, or listing incoming commits. */ protected final RevWalk walk; - private ObjectWriter writer; + private ObjectInserter inserter; /** The original objects supplied in the merge; this can be any tree-ish. */ protected RevObject[] sourceObjects; @@ -105,10 +105,10 @@ public Repository getRepository() { /** * @return an object writer to create objects in {@link #getRepository()}. */ - public ObjectWriter getObjectWriter() { - if (writer == null) - writer = new ObjectWriter(getRepository()); - return writer; + public ObjectInserter getObjectInserter() { + if (inserter == null) + inserter = getRepository().newObjectInserter(); + return inserter; } /** diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java index 6cd244599..aa2321b4a 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/merge/StrategySimpleTwoWayInCore.java @@ -51,6 +51,7 @@ import org.eclipse.jgit.errors.UnmergedPathException; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.treewalk.AbstractTreeIterator; import org.eclipse.jgit.treewalk.NameConflictTreeWalk; @@ -152,7 +153,16 @@ else if (tw.isSubtree()) { if (hasConflict) return false; try { - resultTree = cache.writeTree(getObjectWriter()); + ObjectInserter odi = getObjectInserter(); + try { + resultTree = cache.writeTree(odi); + odi.flush(); + } finally { + // We don't know if our caller will release the + // inserter, so make sure we do it ourselves. + // + odi.release(); + } return true; } catch (UnmergedPathException upe) { resultTree = null;