add parsers to get information out of gits commit objects
authorChristian Thaeter <ct@pipapo.org>
Tue, 15 Jan 2008 09:39:33 +0000 (10:39 +0100)
committerChristian Thaeter <ct@pipapo.org>
Tue, 15 Jan 2008 09:39:33 +0000 (10:39 +0100)
src/object.c
src/object.h

index 27c5176..e6955cf 100644 (file)
 #include "object.h"
 #include "repo.h"
 
-#define SHA1_HEADER <openssl/sha.h>
-#include "git/cache.h"
-#include "git/object.h"
-
 
 Html
 webgit_object_link (struct webgit_query* query,
@@ -53,6 +49,158 @@ webgit_object_link (struct webgit_query* query,
 
 
 
+char*
+webgit_commit_tree_parse (struct commit* commit)
+{
+  char* tree = strstr (commit->buffer, "tree ");
+  if (!tree)
+    return NULL;
+  return tree + 5;
+}
+
+time_t
+webgit_commit_author_date_parse (struct commit* commit, struct tm* tm)
+{
+  struct tm tmp;
+  if (!tm)
+    tm = &tmp;
+
+  char* author = strstr (commit->buffer, "author ");
+  if (!author)
+    return (time_t)-1;
+
+  char* beg = strchr (author, '>');
+  if (!beg)
+    return (time_t)-1;
+
+  if (!strptime (beg + 2, "%s %Z", tm))
+    return (time_t)-1;
+
+  return mktime (tm);
+}
+
+Html
+webgit_commit_author_name_parse (struct commit* commit)
+{
+  char* author = strstr (commit->buffer, "author ");
+  if (!author)
+    return NULL;
+
+  char* end = strchr (author, '<');
+  if (!end)
+    return NULL;
+
+  return html_fmt ("%.*s", end-author-8, author+7);
+}
+
+Html
+webgit_commit_author_email_parse (struct commit* commit)
+{
+  char* author = strstr (commit->buffer, "author ");
+  if (!author)
+    return NULL;
+
+  char* beg = strchr (author, '<');
+  if (!beg)
+    return NULL;
+
+  char* end = strchr (beg, '>');
+  if (!end)
+    return NULL;
+
+
+  return html_fmt ("%.*s", end-beg-1, beg+1);
+}
+
+time_t
+webgit_commit_committer_date_parse (struct commit* commit, struct tm* tm)
+{
+  struct tm tmp;
+  if (!tm)
+    tm = &tmp;
+
+  char* committer = strstr (commit->buffer, "committer ");
+  if (!committer)
+    return (time_t)-1;
+
+  char* beg = strchr (committer, '>');
+  if (!beg)
+    return (time_t)-1;
+
+  if (!strptime (beg + 2, "%s %Z", tm))
+    return (time_t)-1;
+
+  return mktime (tm);
+}
+
+Html
+webgit_commit_committer_name_parse (struct commit* commit)
+{
+  char* committer = strstr (commit->buffer, "committer ");
+  if (!committer)
+    return NULL;
+
+  char* end = strchr (committer, '<');
+  if (!end)
+    return NULL;
+
+  return html_fmt ("%.*s", end-committer-11, committer+10);
+}
+
+Html
+webgit_commit_committer_email_parse (struct commit* commit)
+{
+  char* committer = strstr (commit->buffer, "committer ");
+  if (!committer)
+    return NULL;
+
+  char* beg = strchr (committer, '<');
+  if (!beg)
+    return NULL;
+
+  char* end = strchr (beg, '>');
+  if (!end)
+    return NULL;
+
+
+  return html_fmt ("%.*s", end-beg-1, beg+1);
+}
+
+Html
+webgit_header_parse (struct commit* commit)
+{
+  char* header = strstr (commit->buffer, "\n\n");
+  if (!header)
+    return NULL;
+
+  char* end = strchr (header+2, '\n');
+  if (!end)
+    end = header + strlen (header+2);
+  else
+    --end;
+
+  return html_fmt ("%.*s", end-header, header+2);
+}
+
+Html
+webgit_message_parse (struct commit* commit)
+{
+  char* header = strstr (commit->buffer, "\n\n");
+  if (!header)
+    return NULL;
+
+  header = strchr (header+2, '\n');
+  if (!header)
+    return html ();
+  else
+    ++header;
+
+  return html_fmt ("%.*s", strlen (header), header);
+}
+
+
+
+
 /*
   Display commits
 */
index 31eb4a8..ca955c2 100644 (file)
 
 #include "webgit.h"
 
+#define SHA1_HEADER <openssl/sha.h>
+#include "git/cache.h"
+#include "git/object.h"
+#include "git/commit.h"
+
 Html
 webgit_object_link (struct webgit_query* query,
                    const char* repo,
@@ -32,6 +37,33 @@ webgit_object_link (struct webgit_query* query,
                    const char* path,
                    Html text);
 
+char*
+webgit_commit_tree_parse (struct commit* commit);
+
+time_t
+webgit_commit_author_date_parse (struct commit* commit, struct tm* tm);
+
+Html
+webgit_commit_author_name_parse (struct commit* commit);
+
+Html
+webgit_commit_author_email_parse (struct commit* commit);
+
+time_t
+webgit_commit_committer_date_parse (struct commit* commit, struct tm* tm);
+
+Html
+webgit_commit_committer_name_parse (struct commit* commit);
+
+Html
+webgit_commit_committer_email_parse (struct commit* commit);
+
+Html
+webgit_header_parse (struct commit* commit);
+
+Html
+webgit_message_parse (struct commit* commit);
+
 Html
 webgit_object_commit_action (struct webgit_query* query, unsigned char* sha1);