diff --git a/src/commit.c b/src/commit.c index 11f76e30c..a1a5bf7f5 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 50acd0c53..524570f2c 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 @@ -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 000000000..d5f668c54 --- /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 d23f6863f..422ef9df8 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 000000000..2ba363e58 --- /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 000000000..532a2f46e --- /dev/null +++ b/src/tree.h @@ -0,0 +1,13 @@ +#ifndef INCLUDE_tree_h__ +#define INCLUDE_tree_h__ + +#include +#include "revobject.h" + +struct git_tree { + git_revpool_object object; +}; + +void git_tree__free(git_tree *tree); + +#endif