summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2006-12-16 13:25:41 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2006-12-16 13:25:41 (UTC)
commit77078ba716ccdfdc954741355dd6a17632db961b (patch) (side-by-side diff)
treeef66d7a2690c90981ab0f446a19111a04d121c7a
parent7c849d94ec1cfecdec5a88d49f5af5c98f96ebca (diff)
downloadcgit-77078ba716ccdfdc954741355dd6a17632db961b.zip
cgit-77078ba716ccdfdc954741355dd6a17632db961b.tar.gz
cgit-77078ba716ccdfdc954741355dd6a17632db961b.tar.bz2
Teach commit parser about author/committer email + timestamp
We want all four of these when showing a commit, so save them in the commitinfo struct. Btw: There's probably no good reason to save committer timestamp since it's already available in commit->date. But it doesn't hurt us either, and it makes the parser look more complete, so we just do it. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.h4
-rw-r--r--parsing.c12
2 files changed, 14 insertions, 2 deletions
diff --git a/cgit.h b/cgit.h
index b6b60c6..f06a941 100644
--- a/cgit.h
+++ b/cgit.h
@@ -1,45 +1,49 @@
#ifndef CGIT_H
#define CGIT_H
#include "git.h"
#include <openssl/sha.h>
#include <ctype.h>
#include <sched.h>
typedef void (*configfn)(const char *name, const char *value);
struct cacheitem {
char *name;
struct stat st;
int ttl;
int fd;
};
struct commitinfo {
struct commit *commit;
char *author;
+ char *author_email;
+ unsigned long author_date;
char *committer;
+ char *committer_email;
+ unsigned long committer_date;
char *subject;
char *msg;
};
extern const char cgit_version[];
extern char *cgit_root;
extern char *cgit_root_title;
extern char *cgit_css;
extern char *cgit_logo;
extern char *cgit_logo_link;
extern char *cgit_virtual_root;
extern char *cgit_cache_root;
extern int cgit_nocache;
extern int cgit_max_lock_attempts;
extern int cgit_cache_root_ttl;
extern int cgit_cache_repo_ttl;
extern int cgit_cache_dynamic_ttl;
extern int cgit_cache_static_ttl;
extern int cgit_cache_max_create_time;
extern char *cgit_repo_name;
extern char *cgit_repo_desc;
diff --git a/parsing.c b/parsing.c
index be471b5..4d5cc74 100644
--- a/parsing.c
+++ b/parsing.c
@@ -114,47 +114,55 @@ char *substr(const char *head, const char *tail)
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;
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 = strchr(p, '\n') + 1;
+ 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 = strchr(p, '\n') + 1;
+ 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');
ret->subject = substr(p, t);
p = t + 1;
while (*p == '\n')
p = strchr(p, '\n') + 1;
ret->msg = p;
return ret;
}