+static int end_of_header(const char *p)
+{
+ return !p || (*p == '\n');
+}
+
+struct commitinfo *cgit_parse_commit(struct commit *commit)
+{
+ struct commitinfo *ret;
+ const char *p = repo_get_commit_buffer(the_repository, commit, NULL);
+ const char *t;
+
+ ret = xcalloc(1, sizeof(struct commitinfo));
+ ret->commit = commit;
+
+ if (!p)
+ return ret;
+
+ if (!skip_prefix(p, "tree ", &p))
+ die("Bad commit: %s", oid_to_hex(&commit->object.oid));
+ p += the_hash_algo->hexsz + 1;
+
+ while (skip_prefix(p, "parent ", &p))
+ p += the_hash_algo->hexsz + 1;
+
+ if (p && skip_prefix(p, "author ", &p)) {
+ parse_user(p, &ret->author, &ret->author_email,
+ &ret->author_date, &ret->author_tz);
+ p = next_header_line(p);
+ }
+
+ if (p && skip_prefix(p, "committer ", &p)) {
+ parse_user(p, &ret->committer, &ret->committer_email,
+ &ret->committer_date, &ret->committer_tz);
+ p = next_header_line(p);
+ }
+
+ if (p && skip_prefix(p, "encoding ", &p)) {
+ t = strchr(p, '\n');
+ if (t) {
+ ret->msg_encoding = substr(p, t + 1);
+ p = t + 1;