git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[JGIT PATCH 07/10] Recursively load an entire tree into a DirCacheBuilder

From
Shawn O. Pearce <spearce@spearce.org>
Date
Jan 22, 2009, 23:28 UTC
Message-ID
<1232666890-23488-8-git-send-email-spearce@spearce.org>
In-Reply-To
<1232666890-23488-7-git-send-email-spearce@spearce.org>

This implements the DirCache portion of "git read-tree", where a tree can be recursively read into a DirCache instance without an impact on the working directory.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../org/spearce/jgit/dircache/DirCacheBuilder.java |   65 ++++++++++++++++++++
 1 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/dircache/DirCacheBuilder.java b/org.spearce.jgit/src/org/spearce/jgit/dircache/DirCacheBuilder.java
index 3a37054..10161fa 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/dircache/DirCacheBuilder.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/dircache/DirCacheBuilder.java
@@ -37,8 +37,16 @@
 
 package org.spearce.jgit.dircache;
 
+import java.io.IOException;
 import java.util.Arrays;
 
+import org.spearce.jgit.lib.AnyObjectId;
+import org.spearce.jgit.lib.Repository;
+import org.spearce.jgit.lib.WindowCursor;
+import org.spearce.jgit.treewalk.AbstractTreeIterator;
+import org.spearce.jgit.treewalk.CanonicalTreeParser;
+import org.spearce.jgit.treewalk.TreeWalk;
+
 /**
  * Updates a {@link DirCache} by adding individual {@link DirCacheEntry}s.
  * <p>
@@ -112,6 +120,63 @@ public void keep(final int pos, int cnt) {
 		fastKeep(pos, cnt);
 	}
 
+	/**
+	 * Recursively add an entire tree into this builder.
+	 * <p>
+	 * If pathPrefix is "a/b" and the tree contains file "c" then the resulting
+	 * DirCacheEntry will have the path "a/b/c".
+	 * <p>
+	 * All entries are inserted at stage 0, therefore assuming that the
+	 * application will not insert any other paths with the same pathPrefix.
+	 * 
+	 * @param pathPrefix
+	 *            UTF-8 encoded prefix to mount the tree's entries at. If the
+	 *            path does not end with '/' one will be automatically inserted
+	 *            as necessary.
+	 * @param db
+	 *            repository the tree(s) will be read from during recursive
+	 *            traversal. This must be the same repository that the resulting
+	 *            DirCache would be written out to (or used in) otherwise the
+	 *            caller is simply asking for deferred MissingObjectExceptions.
+	 * @param tree
+	 *            the tree to recursively add. This tree's contents will appear
+	 *            under <code>pathPrefix</code>. The ObjectId must be that of a
+	 *            tree; the caller is responsible for dereferencing a tag or
+	 *            commit (if necessary).
+	 * @throws IOException
+	 *             a tree cannot be read to iterate through its entries.
+	 */
+	public void addTree(final byte[] pathPrefix, final Repository db,
+			final AnyObjectId tree) throws IOException {
+		final TreeWalk tw = new TreeWalk(db);
+		tw.reset();
+		final WindowCursor curs = new WindowCursor();
+		try {
+			tw.addTree(new CanonicalTreeParser(pathPrefix, db, tree
+					.toObjectId(), curs));
+		} finally {
+			curs.release();
+		}
+		tw.setRecursive(true);
+		if (tw.next()) {
+			final DirCacheEntry newEntry = toEntry(tw);
+			beforeAdd(newEntry);
+			fastAdd(newEntry);
+			while (tw.next())
+				fastAdd(toEntry(tw));
+		}
+	}
+
+	private DirCacheEntry toEntry(final TreeWalk tw) {
+		final DirCacheEntry e = new DirCacheEntry(tw.getRawPath());
+		final AbstractTreeIterator i;
+
+		i = tw.getTree(0, AbstractTreeIterator.class);
+		e.setFileMode(tw.getFileMode(0));
+		e.setObjectIdFromRaw(i.idBuffer(), i.idOffset());
+		return e;
+	}
+
 	public void finish() {
 		if (!sorted)
 			resort();
-- 
1.6.1.399.g0d272
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 8 of 12 in “Merge API v2”
  1. 00/10 Merge API v2Shawn O. Pearce, Jan 22, 2009
  2. 01/10 Fix TreeWalk.idEqual when both trees are missing the pathShawn O. Pearce, Jan 22, 2009
  3. 02/10 Expose the raw path for the current entry of a TreeWalkShawn O. Pearce, Jan 22, 2009
  4. 03/10 Expose DirCacheEntry.getFileMode as a utility functionShawn O. Pearce, Jan 22, 2009
  5. 04/10 Add writeTree support to DirCacheShawn O. Pearce, Jan 22, 2009
  6. 05/10 Allow a DirCache to be created with no backing store fileShawn O. Pearce, Jan 22, 2009
  7. 06/10 Allow CanonicalTreeParsers to be created with a UTF-8 path prefixShawn O. Pearce, Jan 22, 2009
  8. 07/10 Recursively load an entire tree into a DirCacheBuilderShawn O. Pearce, Jan 22, 2009
  9. 08/10 Allow DirCacheEntry instances to be created with stage > 0Shawn O. Pearce, Jan 22, 2009
  10. 09/10 Define a basic merge API, and a two-way tree merge strategyShawn O. Pearce, Jan 22, 2009
  11. 10/10 Add a few simple merge test casesShawn O. Pearce, Jan 22, 2009
  12. Robin RosenbergJan 23, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.