mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 17:05:49 +00:00
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>
This commit is contained in:
parent
40721f6b12
commit
225fe21522
@ -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 @@
|
|||||||
#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 {
|
|||||||
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,
|
||||||
|
39
src/git/tree.h
Normal file
39
src/git/tree.h
Normal file
@ -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
|
@ -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);
|
||||||
|
67
src/tree.c
Normal file
67
src/tree.c
Normal file
@ -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;
|
||||||
|
}
|
13
src/tree.h
Normal file
13
src/tree.h
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user