summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
authornulltoken <emeric.fermas@gmail.com>2012-11-19 18:49:25 +0100
committernulltoken <emeric.fermas@gmail.com>2012-12-01 08:34:29 +0100
commitbc05f30c470f7d147ff85b30ad5719bbce70a4a3 (patch)
tree5a425363075c894533f8bd80fcefb7bcfc289ca7 /src/object.c
parent621730383a2298431fd3ea3cbc754f7cf18a1eba (diff)
downloadlibgit2-bc05f30c470f7d147ff85b30ad5719bbce70a4a3.tar.gz
object: refine git_object_peel() error report
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/src/object.c b/src/object.c
index f88c2ba50..d57b6468c 100644
--- a/src/object.c
+++ b/src/object.c
@@ -304,12 +304,6 @@ size_t git_object__size(git_otype type)
return git_objects_table[type].size;
}
-static int peel_error(int error, const char* msg)
-{
- giterr_set(GITERR_INVALID, "The given object cannot be peeled - %s", msg);
- return error;
-}
-
static int dereference_object(git_object **dereferenced, git_object *obj)
{
git_otype type = git_object_type(obj);
@@ -322,22 +316,46 @@ static int dereference_object(git_object **dereferenced, git_object *obj)
return git_tag_target(dereferenced, (git_tag*)obj);
case GIT_OBJ_BLOB:
- return peel_error(GIT_ERROR, "cannot dereference blob");
+ return GIT_ENOTFOUND;
case GIT_OBJ_TREE:
- return peel_error(GIT_ERROR, "cannot dereference tree");
+ return GIT_EAMBIGUOUS;
default:
- return peel_error(GIT_ENOTFOUND, "unexpected object type encountered");
+ return GIT_EINVALIDSPEC;
}
}
+static int peel_error(int error, const git_oid *oid, git_otype type)
+{
+ const char *type_name;
+ char hex_oid[GIT_OID_HEXSZ + 1];
+
+ type_name = git_object_type2string(type);
+
+ git_oid_fmt(hex_oid, oid);
+ hex_oid[GIT_OID_HEXSZ] = '\0';
+
+ giterr_set(GITERR_OBJECT, "The git_object of id '%s' can not be "
+ "successfully peeled into a %s (git_otype=%i).", hex_oid, type_name, type);
+
+ return error;
+}
+
int git_object_peel(
git_object **peeled,
const git_object *object,
git_otype target_type)
{
git_object *source, *deref = NULL;
+ int error;
+
+ if (target_type != GIT_OBJ_TAG &&
+ target_type != GIT_OBJ_COMMIT &&
+ target_type != GIT_OBJ_TREE &&
+ target_type != GIT_OBJ_BLOB &&
+ target_type != GIT_OBJ_ANY)
+ return GIT_EINVALIDSPEC;
assert(object && peeled);
@@ -346,7 +364,7 @@ int git_object_peel(
source = (git_object *)object;
- while (!dereference_object(&deref, source)) {
+ while (!(error = dereference_object(&deref, source))) {
if (source != object)
git_object_free(source);
@@ -371,6 +389,10 @@ int git_object_peel(
git_object_free(source);
git_object_free(deref);
- return -1;
+
+ if (error)
+ error = peel_error(error, git_object_id(object), target_type);
+
+ return error;
}