Commit 225fe21522a98075bdc18dae90ce459f797ac366

Vicent Marti 2010-06-18T13:06:34

Add support for tree objects in revision pools Commits now store pointers to their tree objects. Tree objects now work as separate git_revpool_object entities. Tree objects can be loaded and parsed inedependently from commits. Signed-off-by: Vicent Marti <tanoku@gmail.com>

diff --git a/src/commit.c b/src/commit.c
index 11f76e3..a1a5bf7 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -196,8 +196,9 @@ int git_commit__parse_buffer(git_commit *commit, void *data, size_t len)
 	if (git_commit__parse_oid(&oid, &buffer, buffer_end, "tree ") < 0)
 		return GIT_EOBJCORRUPTED;
 
+	commit->tree = git_tree_lookup(commit->object.pool, &oid);
+
 	/*
-	 * TODO: load tree into commit object
 	 * TODO: commit grafts!
 	 */
 
diff --git a/src/commit.h b/src/commit.h
index 50acd0c..524570f 100644
--- a/src/commit.h
+++ b/src/commit.h
@@ -2,6 +2,7 @@
 #define INCLUDE_commit_h__
 
 #include "git/commit.h"
+#include "tree.h"
 #include "revobject.h"
 
 #include <time.h>
@@ -22,12 +23,15 @@ struct git_commit_list {
 typedef struct git_commit_list git_commit_list;
 typedef struct git_commit_node git_commit_node;
 
+
 struct git_commit {
 	git_revpool_object object;
 
 	time_t commit_time;
 	git_commit_list parents;
 
+	git_tree *tree;
+
 	unsigned short in_degree;
 	unsigned parsed:1,
 			 seen:1,
diff --git a/src/git/tree.h b/src/git/tree.h
new file mode 100644
index 0000000..d5f668c
--- /dev/null
+++ b/src/git/tree.h
@@ -0,0 +1,39 @@
+#ifndef INCLUDE_git_tree_h__
+#define INCLUDE_git_tree_h__
+
+#include "common.h"
+#include "oid.h"
+
+/**
+ * @file git/tree.h
+ * @brief Git tree parsing, loading routines
+ * @defgroup git_tree Git tree parsing, loading routines
+ * @ingroup Git
+ * @{
+ */
+GIT_BEGIN_DECL
+
+/** Representation of a tree object. */
+typedef struct git_tree git_tree;
+
+/**
+ * Locate a reference to a tree without loading it.
+ * The generated tree object is owned by the revision
+ * pool and shall not be freed by the user.
+ *
+ * @param pool the pool to use when locating the tree.
+ * @param id identity of the tree to locate.
+ * @return the tree; NULL if the tree could not be created
+ */
+GIT_EXTERN(git_tree *) git_tree_lookup(git_revpool *pool, const git_oid *id);
+
+/**
+ * Get the id of a tree.
+ * @param tree a previously loaded tree.
+ * @return object identity for the tree.
+ */
+GIT_EXTERN(const git_oid *) git_tree_id(git_tree *tree);
+
+/** @} */
+GIT_END_DECL
+#endif
diff --git a/src/revwalk.c b/src/revwalk.c
index d23f686..422ef9d 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -60,6 +60,9 @@ void gitrp_free(git_revpool *walk)
 			git_commit__free((git_commit *)obj);
 			break;
 
+		case GIT_OBJ_TREE:
+			git_tree__free((git_tree *)obj);
+			break;
 
 		default:
 			free(obj);
diff --git a/src/tree.c b/src/tree.c
new file mode 100644
index 0000000..2ba363e
--- /dev/null
+++ b/src/tree.c
@@ -0,0 +1,67 @@
+/*
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2,
+ * as published by the Free Software Foundation.
+ *
+ * In addition to the permissions in the GNU General Public License,
+ * the authors give you unlimited permission to link the compiled
+ * version of this file into combinations with other programs,
+ * and to distribute those combinations without any restriction
+ * coming from the use of this file.  (The General Public License
+ * restrictions do apply in other respects; for example, they cover
+ * modification of the file, and distribution when not linked into
+ * a combined executable.)
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "common.h"
+#include "commit.h"
+#include "revwalk.h"
+#include "tree.h"
+
+void git_tree__free(git_tree *tree)
+{
+	free(tree);
+}
+
+const git_oid *git_tree_id(git_tree *tree)
+{
+	return &tree->object.id;
+}
+
+git_tree *git_tree_lookup(git_revpool *pool, const git_oid *id)
+{
+	git_tree *tree = NULL;
+
+	if (pool == NULL)
+		return NULL;
+
+	tree = (git_tree *)git_revpool_table_lookup(pool->objects, id);
+	if (tree != NULL)
+		return tree;
+
+	tree = git__malloc(sizeof(git_tree));
+
+	if (tree == NULL)
+		return NULL;
+
+	memset(tree, 0x0, sizeof(git_tree));
+
+	/* Initialize parent object */
+	git_oid_cpy(&tree->object.id, id);
+	tree->object.pool = pool;
+	tree->object.type = GIT_OBJ_TREE;
+
+	git_revpool_table_insert(pool->objects, (git_revpool_object *)tree);
+
+	return tree;
+}
diff --git a/src/tree.h b/src/tree.h
new file mode 100644
index 0000000..532a2f4
--- /dev/null
+++ b/src/tree.h
@@ -0,0 +1,13 @@
+#ifndef INCLUDE_tree_h__
+#define INCLUDE_tree_h__
+
+#include <git/tree.h>
+#include "revobject.h"
+
+struct git_tree {
+	git_revpool_object object;
+};
+
+void git_tree__free(git_tree *tree);
+
+#endif