summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
authorVicent Martí <tanoku@gmail.com>2012-05-05 14:22:06 -0700
committerVicent Martí <tanoku@gmail.com>2012-05-05 14:22:06 -0700
commit4ef14af93517b3842bc0dfa24147cf10dd029582 (patch)
tree88f90fa8c9d903f072a2b1c647c51a9899e520c7 /src/object.c
parentf95e8cc07c85034f737872455fce2895186be19d (diff)
parent282283acc65bab9de231a2b3dc489eb171d5f1cf (diff)
downloadlibgit2-development-merge.tar.gz
Merge pull request #664 from arrbee/attrs-from-indexdevelopment-merge
Support git attrs from index (and bare repo)
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/src/object.c b/src/object.c
index 8e8eac4e3..e02bd69ba 100644
--- a/src/object.c
+++ b/src/object.c
@@ -146,7 +146,7 @@ int git_object_lookup_prefix(
}
if (error < 0)
- return -1;
+ return error;
if (type != GIT_OBJ_ANY && type != odb_obj->raw.type) {
git_odb_object_free(odb_obj);
@@ -292,3 +292,42 @@ size_t git_object__size(git_otype type)
return git_objects_table[type].size;
}
+int git_object__resolve_to_type(git_object **obj, git_otype type)
+{
+ int error = 0;
+ git_object *scan, *next;
+
+ if (type == GIT_OBJ_ANY)
+ return 0;
+
+ scan = *obj;
+
+ while (!error && scan && git_object_type(scan) != type) {
+
+ switch (git_object_type(scan)) {
+ case GIT_OBJ_COMMIT:
+ {
+ git_tree *tree = NULL;
+ error = git_commit_tree(&tree, (git_commit *)scan);
+ next = (git_object *)tree;
+ break;
+ }
+
+ case GIT_OBJ_TAG:
+ error = git_tag_target(&next, (git_tag *)scan);
+ break;
+
+ default:
+ giterr_set(GITERR_REFERENCE, "Object does not resolve to type");
+ error = -1;
+ next = NULL;
+ break;
+ }
+
+ git_object_free(scan);
+ scan = next;
+ }
+
+ *obj = scan;
+ return error;
+}