Commit 73bd6411 by Patrick Steinhardt

tree: implement function to parse raw data

Currently, parsing objects is strictly tied to having an ODB object
available. This makes it hard to parse an object when all that is
available is its raw object and size. Furthermore, hacking around that
limitation by directly creating an ODB structure either on stack or on
heap does not really work that well due to ODB objects being reference
counted and then automatically free'd when reaching a reference count of
zero.

Implement a function `git_tree__parse_raw` to parse a tree object from a
pair of `data` and `size`.
parent af5cd936
...@@ -375,18 +375,16 @@ static int parse_mode(unsigned int *modep, const char *buffer, const char **buff ...@@ -375,18 +375,16 @@ static int parse_mode(unsigned int *modep, const char *buffer, const char **buff
return 0; return 0;
} }
int git_tree__parse(void *_tree, git_odb_object *odb_obj) int git_tree__parse_raw(void *_tree, const char *data, size_t size)
{ {
git_tree *tree = _tree; git_tree *tree = _tree;
const char *buffer; const char *buffer;
const char *buffer_end; const char *buffer_end;
if (git_odb_object_dup(&tree->odb_obj, odb_obj) < 0) buffer = data;
return -1; buffer_end = buffer + size;
buffer = git_odb_object_data(tree->odb_obj);
buffer_end = buffer + git_odb_object_size(tree->odb_obj);
tree->odb_obj = NULL;
git_array_init_to_size(tree->entries, DEFAULT_TREE_SIZE); git_array_init_to_size(tree->entries, DEFAULT_TREE_SIZE);
GITERR_CHECK_ARRAY(tree->entries); GITERR_CHECK_ARRAY(tree->entries);
...@@ -426,6 +424,21 @@ int git_tree__parse(void *_tree, git_odb_object *odb_obj) ...@@ -426,6 +424,21 @@ int git_tree__parse(void *_tree, git_odb_object *odb_obj)
return 0; return 0;
} }
int git_tree__parse(void *_tree, git_odb_object *odb_obj)
{
git_tree *tree = _tree;
if ((git_tree__parse_raw(tree,
git_odb_object_data(odb_obj),
git_odb_object_size(odb_obj))) < 0)
return -1;
if (git_odb_object_dup(&tree->odb_obj, odb_obj) < 0)
return -1;
return 0;
}
static size_t find_next_dir(const char *dirname, git_index *index, size_t start) static size_t find_next_dir(const char *dirname, git_index *index, size_t start)
{ {
size_t dirlen, i, entries = git_index_entrycount(index); size_t dirlen, i, entries = git_index_entrycount(index);
......
...@@ -41,6 +41,7 @@ GIT_INLINE(bool) git_tree_entry__is_tree(const struct git_tree_entry *e) ...@@ -41,6 +41,7 @@ GIT_INLINE(bool) git_tree_entry__is_tree(const struct git_tree_entry *e)
void git_tree__free(void *tree); void git_tree__free(void *tree);
int git_tree__parse(void *tree, git_odb_object *obj); int git_tree__parse(void *tree, git_odb_object *obj);
int git_tree__parse_raw(void *_tree, const char *data, size_t size);
/** /**
* Write a tree to the given repository * Write a tree to the given repository
......
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