summaryrefslogtreecommitdiffabout
path: root/parsing.c
authorLars Hjemli <hjemli@gmail.com>2007-01-17 00:09:51 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-01-17 00:09:51 (UTC)
commita69061fdb7380d73715aeb3a0da6e91a24df90e4 (patch) (side-by-side diff)
treebb514d5bfbab6e3b2904b2633a33175802f084d2 /parsing.c
parent06c81d6faafff1c80bc9e2302e5b8fea393b775b (diff)
downloadcgit-a69061fdb7380d73715aeb3a0da6e91a24df90e4.zip
cgit-a69061fdb7380d73715aeb3a0da6e91a24df90e4.tar.gz
cgit-a69061fdb7380d73715aeb3a0da6e91a24df90e4.tar.bz2
Add function cgit_parse_tag()
Teach cgit how to extract author info from a tag. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'parsing.c') (more/less context) (ignore whitespace changes)
-rw-r--r--parsing.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/parsing.c b/parsing.c
index 4412dee..8aad1dd 100644
--- a/parsing.c
+++ b/parsing.c
@@ -103,96 +103,143 @@ int cgit_parse_query(char *txt, configfn fn)
char *t, *value = NULL, c;
if (!txt)
return 0;
t = txt = xstrdup(txt);
while((c=*t) != '\0') {
if (c=='=') {
*t = '\0';
value = t+1;
} else if (c=='+') {
*t = ' ';
} else if (c=='%') {
t = convert_query_hexchar(t);
} else if (c=='&') {
*t = '\0';
(*fn)(txt, value);
txt = t+1;
value = NULL;
}
t++;
}
if (t!=txt)
(*fn)(txt, value);
return 0;
}
char *substr(const char *head, const char *tail)
{
char *buf;
buf = xmalloc(tail - head + 1);
strncpy(buf, head, tail - head);
buf[tail - head] = '\0';
return buf;
}
struct commitinfo *cgit_parse_commit(struct commit *commit)
{
struct commitinfo *ret;
char *p = commit->buffer, *t = commit->buffer;
ret = xmalloc(sizeof(*ret));
ret->commit = commit;
ret->author = NULL;
ret->author_email = NULL;
ret->committer = NULL;
ret->committer_email = NULL;
ret->subject = NULL;
ret->msg = NULL;
if (strncmp(p, "tree ", 5))
die("Bad commit: %s", sha1_to_hex(commit->object.sha1));
else
p += 46; // "tree " + hex[40] + "\n"
while (!strncmp(p, "parent ", 7))
p += 48; // "parent " + hex[40] + "\n"
if (!strncmp(p, "author ", 7)) {
p += 7;
t = strchr(p, '<') - 1;
ret->author = substr(p, t);
p = t;
t = strchr(t, '>') + 1;
ret->author_email = substr(p, t);
ret->author_date = atol(++t);
p = strchr(t, '\n') + 1;
}
if (!strncmp(p, "committer ", 9)) {
p += 9;
t = strchr(p, '<') - 1;
ret->committer = substr(p, t);
p = t;
t = strchr(t, '>') + 1;
ret->committer_email = substr(p, t);
ret->committer_date = atol(++t);
p = strchr(t, '\n') + 1;
}
while (*p == '\n')
p = strchr(p, '\n') + 1;
t = strchr(p, '\n');
if (t && *t) {
ret->subject = substr(p, t);
p = t + 1;
while (*p == '\n')
p = strchr(p, '\n') + 1;
ret->msg = p;
}
return ret;
}
+
+
+struct taginfo *cgit_parse_tag(struct tag *tag)
+{
+ void *data;
+ char type[20];
+ unsigned long size;
+ char *p, *t;
+ struct taginfo *ret;
+
+ data = read_sha1_file(tag->object.sha1, type, &size);
+ if (!data || strcmp(type, tag_type)) {
+ free(data);
+ return 0;
+ }
+
+ ret = xmalloc(sizeof(*ret));
+ ret->tagger = NULL;
+ ret->tagger_email = NULL;
+ ret->tagger_date = 0;
+ ret->msg = NULL;
+
+ p = data;
+
+ while (p) {
+ if (*p == '\n')
+ break;
+
+ if (!strncmp(p, "tagger ", 7)) {
+ p += 7;
+ t = strchr(p, '<') - 1;
+ ret->tagger = substr(p, t);
+ p = t;
+ t = strchr(t, '>') + 1;
+ ret->tagger_email = substr(p, t);
+ ret->tagger_date = atol(++t);
+ }
+ p = strchr(p, '\n') + 1;
+ }
+
+ while (p && (*p == '\n'))
+ p = strchr(p, '\n') + 1;
+ if (p)
+ ret->msg = xstrdup(p);
+ free(data);
+ return ret;
+}