summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2017-10-13 13:12:17 +0200
committerPatrick Steinhardt <ps@pks.im>2018-06-22 09:50:07 +0200
commit73bd64110d16c06833f854a8178176355f249a61 (patch)
treec180e5e1fd0746139596156b025cd15e87ad305b
parentaf5cd936faa688cde9b31d8858c32acac4d2adf5 (diff)
downloadlibgit2-73bd64110d16c06833f854a8178176355f249a61.tar.gz
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`.
-rw-r--r--src/tree.c25
-rw-r--r--src/tree.h1
2 files changed, 20 insertions, 6 deletions
diff --git a/src/tree.c b/src/tree.c
index be0f528c2..823385722 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -375,18 +375,16 @@ static int parse_mode(unsigned int *modep, const char *buffer, const char **buff
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;
const char *buffer;
const char *buffer_end;
- if (git_odb_object_dup(&tree->odb_obj, odb_obj) < 0)
- return -1;
-
- buffer = git_odb_object_data(tree->odb_obj);
- buffer_end = buffer + git_odb_object_size(tree->odb_obj);
+ buffer = data;
+ buffer_end = buffer + size;
+ tree->odb_obj = NULL;
git_array_init_to_size(tree->entries, DEFAULT_TREE_SIZE);
GITERR_CHECK_ARRAY(tree->entries);
@@ -426,6 +424,21 @@ int git_tree__parse(void *_tree, git_odb_object *odb_obj)
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)
{
size_t dirlen, i, entries = git_index_entrycount(index);
diff --git a/src/tree.h b/src/tree.h
index fbee5efe1..973ba15d0 100644
--- a/src/tree.h
+++ b/src/tree.h
@@ -41,6 +41,7 @@ GIT_INLINE(bool) git_tree_entry__is_tree(const struct git_tree_entry *e)
void git_tree__free(void *tree);
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