summaryrefslogtreecommitdiff
path: root/sha1_name.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2007-12-24 08:51:01 (GMT)
committerJunio C Hamano <gitster@pobox.com>2008-02-18 08:51:05 (GMT)
commit8177631547e4d10ae071def07eff83e056092bfa (patch)
treeb926ce332cae49c9c9b86ccf824a551923bf76ff /sha1_name.c
parent525ab63950e324823dd45423104cdcf5e46e2610 (diff)
downloadgit-8177631547e4d10ae071def07eff83e056092bfa.zip
git-8177631547e4d10ae071def07eff83e056092bfa.tar.gz
git-8177631547e4d10ae071def07eff83e056092bfa.tar.bz2
expose a helper function peel_to_type().
This helper function is the core of "$object^{type}" parser. Now it is made available to callers outside sha1_name.c
Diffstat (limited to 'sha1_name.c')
-rw-r--r--sha1_name.c57
1 files changed, 38 insertions, 19 deletions
diff --git a/sha1_name.c b/sha1_name.c
index ed3c867..739f1b2 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -423,6 +423,37 @@ static int get_nth_ancestor(const char *name, int len,
return 0;
}
+struct object *peel_to_type(const char *name, int namelen,
+ struct object *o, enum object_type expected_type)
+{
+ if (name && !namelen)
+ namelen = strlen(name);
+ if (!o) {
+ unsigned char sha1[20];
+ if (get_sha1_1(name, namelen, sha1))
+ return NULL;
+ o = parse_object(sha1);
+ }
+ while (1) {
+ if (!o || (!o->parsed && !parse_object(o->sha1)))
+ return NULL;
+ if (o->type == expected_type)
+ return o;
+ if (o->type == OBJ_TAG)
+ o = ((struct tag*) o)->tagged;
+ else if (o->type == OBJ_COMMIT)
+ o = &(((struct commit *) o)->tree->object);
+ else {
+ if (name)
+ error("%.*s: expected %s type, but the object "
+ "dereferences to %s type",
+ namelen, name, typename(expected_type),
+ typename(o->type));
+ return NULL;
+ }
+ }
+}
+
static int peel_onion(const char *name, int len, unsigned char *sha1)
{
unsigned char outer[20];
@@ -474,29 +505,17 @@ static int peel_onion(const char *name, int len, unsigned char *sha1)
hashcpy(sha1, o->sha1);
}
else {
- /* At this point, the syntax look correct, so
+ /*
+ * At this point, the syntax look correct, so
* if we do not get the needed object, we should
* barf.
*/
-
- while (1) {
- if (!o || (!o->parsed && !parse_object(o->sha1)))
- return -1;
- if (o->type == expected_type) {
- hashcpy(sha1, o->sha1);
- return 0;
- }
- if (o->type == OBJ_TAG)
- o = ((struct tag*) o)->tagged;
- else if (o->type == OBJ_COMMIT)
- o = &(((struct commit *) o)->tree->object);
- else
- return error("%.*s: expected %s type, but the object dereferences to %s type",
- len, name, typename(expected_type),
- typename(o->type));
- if (!o->parsed)
- parse_object(o->sha1);
+ o = peel_to_type(name, len, o, expected_type);
+ if (o) {
+ hashcpy(sha1, o->sha1);
+ return 0;
}
+ return -1;
}
return 0;
}