Commit 225fe215 by Vicent Marti

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>
parent 40721f6b
...@@ -196,8 +196,9 @@ int git_commit__parse_buffer(git_commit *commit, void *data, size_t len) ...@@ -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) if (git_commit__parse_oid(&oid, &buffer, buffer_end, "tree ") < 0)
return GIT_EOBJCORRUPTED; return GIT_EOBJCORRUPTED;
commit->tree = git_tree_lookup(commit->object.pool, &oid);
/* /*
* TODO: load tree into commit object
* TODO: commit grafts! * TODO: commit grafts!
*/ */
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define INCLUDE_commit_h__ #define INCLUDE_commit_h__
#include "git/commit.h" #include "git/commit.h"
#include "tree.h"
#include "revobject.h" #include "revobject.h"
#include <time.h> #include <time.h>
...@@ -22,12 +23,15 @@ struct git_commit_list { ...@@ -22,12 +23,15 @@ struct git_commit_list {
typedef struct git_commit_list git_commit_list; typedef struct git_commit_list git_commit_list;
typedef struct git_commit_node git_commit_node; typedef struct git_commit_node git_commit_node;
struct git_commit { struct git_commit {
git_revpool_object object; git_revpool_object object;
time_t commit_time; time_t commit_time;
git_commit_list parents; git_commit_list parents;
git_tree *tree;
unsigned short in_degree; unsigned short in_degree;
unsigned parsed:1, unsigned parsed:1,
seen:1, seen:1,
......
#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
...@@ -60,6 +60,9 @@ void gitrp_free(git_revpool *walk) ...@@ -60,6 +60,9 @@ void gitrp_free(git_revpool *walk)
git_commit__free((git_commit *)obj); git_commit__free((git_commit *)obj);
break; break;
case GIT_OBJ_TREE:
git_tree__free((git_tree *)obj);
break;
default: default:
free(obj); free(obj);
......
/*
* 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;
}
#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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment