diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-12-24 00:51:01 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-02-18 00:51:05 -0800 |
commit | 8177631547e4d10ae071def07eff83e056092bfa (patch) | |
tree | b926ce332cae49c9c9b86ccf824a551923bf76ff /sha1_name.c | |
parent | 525ab63950e324823dd45423104cdcf5e46e2610 (diff) | |
download | git-8177631547e4d10ae071def07eff83e056092bfa.tar.gz |
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.c | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/sha1_name.c b/sha1_name.c index ed3c867d6a..739f1b2d49 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; } |