summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 525ab63)
raw | patch | inline | side by side (parent: 525ab63)
author | Junio C Hamano <gitster@pobox.com> | |
Mon, 24 Dec 2007 08:51:01 +0000 (00:51 -0800) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 18 Feb 2008 08:51:05 +0000 (00:51 -0800) |
This helper function is the core of "$object^{type}" parser.
Now it is made available to callers outside sha1_name.c
Now it is made available to callers outside sha1_name.c
cache.h | patch | blob | history | |
sha1_name.c | patch | blob | history |
index e1000bccb2470ad66038aabbf57b0af96e506f11..4bfb1ba4999be5e8cf92dcf5ec585528088b8c56 100644 (file)
--- a/cache.h
+++ b/cache.h
unsigned long *size,
unsigned char *sha1_ret);
+extern struct object *peel_to_type(const char *name, int namelen,
+ struct object *o, enum object_type);
+
enum date_mode {
DATE_NORMAL = 0,
DATE_RELATIVE,
diff --git a/sha1_name.c b/sha1_name.c
index ed3c867d6ad5ed181033950fbcca8daa605e6f20..739f1b2d49a6a87e3b5db3d8cadb151d27363a6a 100644 (file)
--- a/sha1_name.c
+++ b/sha1_name.c
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];
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;
}