proper repoinfo ctor/dtor, parsing gitconfig, moved age storage to
authorChristian Thaeter <ct@pipapo.org>
Fri, 28 Dec 2007 23:40:38 +0000 (00:40 +0100)
committerChristian Thaeter <ct@pipapo.org>
Fri, 28 Dec 2007 23:40:38 +0000 (00:40 +0100)
repoinfo etc.

src/actions.c
src/age.c
src/age.h
src/ctgit.h
src/query.c
src/repo.c
src/repo.h

index 9708eef..c4a1353 100644 (file)
@@ -33,7 +33,7 @@
 static Html
 ctgit_main_menu_action (struct ctgit_query* query)
 {
-  return html("TODO");
+  return html ("TODO: main menu sidebar");
 }
 
 static Html
@@ -62,13 +62,13 @@ ctgit_main_content_action (struct ctgit_query* query)
                                      html(html_tag ("td"), n->description),
                                      html(html_tag ("td"), n->owner),
                                      html(html_tag ("td"),
-                                          ctgit_object_link (query, n, "NA", ctgit_repo_age (query, n))
+                                          ctgit_object_link (query, n, "TODO: get last commit", ctgit_pretty_age (n->age))
                                           ),
                                      html(html_tag ("td"),
                                           html(
                                                ctgit_log_link (query, n, html("Log")),
                                                " ",
-                                               ctgit_object_link (query, n, "NA", html("Tree"))
+                                               ctgit_object_link (query, n, "TODO: get last tree", html("Tree"))
                                                )
                                           )
                                      ),
index 0f28987..7fd1c91 100644 (file)
--- a/src/age.c
+++ b/src/age.c
 #include <time.h>
 
 Html
-ctgit_pretty_age (time_t now, time_t past)
+ctgit_pretty_age (unsigned long age)
 {
-  unsigned long age = difftime (now, past);
-
   if (age < 2 * 60)
     return html_fmt("%d secs ago", age / (1));
 
index 74187f8..8baaa0b 100644 (file)
--- a/src/age.h
+++ b/src/age.h
@@ -24,7 +24,7 @@
 #include "ctgit.h"
 
 Html
-ctgit_pretty_age (time_t now, time_t past);
+ctgit_pretty_age (unsigned long age);
 
 
 #endif
index 5287f78..f273727 100644 (file)
@@ -36,7 +36,10 @@ struct ctgit_repo_info
   char* name;
   char* owner;
   char* description;
-  char* pull_url;
+  char* giturl;
+  char* readme;
+
+  unsigned long age;
 };
 
 
@@ -60,4 +63,11 @@ struct ctgit_query
   llist repos;
 };
 
+/*
+  libgit api
+*/
+typedef int (*config_fn_t)(const char *, const char *);
+extern const char* setup_git_directory (void);
+extern int git_config(config_fn_t fn);
+
 #endif
index b5c889f..0c44134 100644 (file)
@@ -25,7 +25,6 @@
 
 #include "cwa.h"
 
-#include <time.h>
 #include <stdint.h>
 
 void
@@ -52,19 +51,7 @@ ctgit_query_destroy (struct ctgit_query* q)
   free (q->head);
 
   LLIST_WHILE_HEAD (&q->repos, head)
-    {
-      struct ctgit_repo_info* h = (struct ctgit_repo_info*)head;
-
-      free (h->path);
-      free (h->name);
-
-      free (h->owner);
-      free (h->description);
-      free (h->pull_url);
-
-      llist_unlink (head);
-      free (h);
-    }
+    ctgit_repoinfo_free ((struct ctgit_repo_info*) head);
 
   return q;
 }
@@ -74,7 +61,7 @@ void
 ctgit_query_add_repo (struct ctgit_query* q, const char* path)
 {
 
-  struct ctgit_repo_info* ri = ctgit_repoinfo_new (path);
+  struct ctgit_repo_info* ri = ctgit_repoinfo_new (q, path);
   if (!ri)
     return;
 
index 7b11fd0..b3549fd 100644 (file)
 #include <unistd.h>
 #include <pwd.h>
 #include <stdint.h>
+#include <time.h>
 
-Html
-ctgit_repo_age (struct ctgit_query* query, struct ctgit_repo_info* n)
+static struct ctgit_repo_info* in_flight;       /* stupid git callback has no void* userdata; we have to pass self in a global */
+
+static void
+ctgit_name_conf (struct ctgit_repo_info* self, const char *value)
 {
-  char buf[512];
+  self->name = cwa_strndup (value, SIZE_MAX);
+}
 
-  snprintf (buf, 512, "%s/.git/refs/heads", n->path);
 
-  struct stat st;
+static void
+ctgit_description_conf (struct ctgit_repo_info* self, const char *value)
+{
+  self->description = cwa_strndup (value, SIZE_MAX);
+}
 
-  if (!stat (buf, &st))
-    return ctgit_pretty_age (query->now, st.st_mtime);
-  else
-    return html("file not found");
+
+static void
+ctgit_giturl_conf (struct ctgit_repo_info* self, const char *value)
+{
+  self->giturl = cwa_strndup (value, SIZE_MAX);
 }
 
 
+static void
+ctgit_readme_conf (struct ctgit_repo_info* self, const char *value)
+{
+  self->readme = cwa_strndup (value, SIZE_MAX);
+}
+
+
+static void
+ctgit_owner_conf (struct ctgit_repo_info* self, const char *value)
+{
+  self->owner = cwa_strndup (value, SIZE_MAX);
+}
+
+
+int
+ctgit_repo_conf_cb (const char *var, const char *value)
+{
+#define CTGIT_CONF(name, _) {CTGIT_CONF_PREFIX #name, ctgit_##name##_conf},
+  struct conf_table{
+    char* name;
+    void (*cb)(struct ctgit_repo_info* self, const char *value);
+  } cmds[] = {CTGIT_CONFS {"", NULL}};
+#undef CTGIT_CONF
+
+  for (struct conf_table* j = cmds; j->cb; ++j)
+    {
+      if (!strcmp (j->name, var))
+        {
+          j->cb (in_flight, value);
+          break;
+        }
+    }
+  return 1;
+}
+
 struct ctgit_repo_info*
-ctgit_repoinfo_new (const char* path)
+ctgit_repoinfo_new (struct ctgit_query* query, const char* path)
 {
   if (!path)
     return NULL;
 
-  // TODO check path == git repo
-
   struct ctgit_repo_info* self = cwa_malloc (sizeof(struct ctgit_repo_info));
 
+  self->name = NULL;
+  self->owner = NULL;
+  self->description = NULL;
+  self->giturl = NULL;
+  self->readme = NULL;
+
   llist_init (&self->node);
   self->path = cwa_strndup (path, SIZE_MAX);
 
-  const char* n;
-  while ((n = strrchr (path, '/')))
-    if (n[1])
-      {
-        ++n;
-        break;
-      }
+  chdir (path);
 
-  if (!n)
-    n = path;
+  const char* subdir = setup_git_directory ();
+  /* strip subdir part off */
+  self->path [strlen (path) - (subdir ? strlen (subdir):0)] = '\0';
 
-  char buf[512];
   struct stat st;
+
+  if (!stat (".git/refs/heads", &st))
+    self->age = difftime (query->now, st.st_mtime);
+  else
+    self->age = ~0;
+
+  /* get [ctgit] subsection out of .git/config */
+  in_flight = self;
+  git_config (ctgit_repo_conf_cb);
+
+  if (!self->name)
+    {
+      /* strip 'name' out of path when not in .git/config */
+      const char* n;
+      while ((n = strrchr (self->path, '/')))
+        if (n[1])
+          {
+            ++n;
+            break;
+          }
+
+      if (!n)
+        n = self->path;
+
+      self->name = cwa_strndup (n, SIZE_MAX);
+    }
+
+  char buf[512];
+  //struct stat st;
   if (stat (path, &st))
     return NULL; // error ILLEGAL dir
 
-  self->name = cwa_strndup (n, SIZE_MAX);       // TODO
-
   struct passwd* pw;
-  if ((pw = getpwuid (st.st_uid)) != NULL)
-    self->owner = cwa_strndup (pw->pw_gecos, strchr (pw->pw_gecos, ',') - pw->pw_gecos);
-  else
-    self->owner = cwa_strndup ("unknown", 100);
+  if (!self->owner)
+    {
+      if ((pw = getpwuid (st.st_uid)) != NULL)
+        self->owner = cwa_strndup (pw->pw_gecos, strchr (pw->pw_gecos, ',') - pw->pw_gecos);
+      else
+        self->owner = cwa_strndup ("unknown", 100);
+    }
 
 
+  //snprintf (buf, 512, "%s/.git/description", path);
 
-  self->description = NULL;
+  //FILE* desc = fopen (buf, "r");
+  if (!self->description)
+    {
+      FILE* desc = fopen (".git/description", "r");
+      if (desc)
+        {
+          fgets (buf, 512, desc);
+          fclose (desc);
+          char* e = strchr (buf, '\n');
+          if (e)
+            *e = '\0';
 
-  snprintf (buf, 512, "%s/.git/description", path);
+          self->description = cwa_strndup (buf, 40);
+        }
+    }
 
-  FILE* desc = fopen (buf, "r");
-  if (desc)
+  if (self->description)
     {
-      fgets (buf, 512, desc);
-      fclose (desc);
-      char* e = strchr (buf, '\n');
-      if (e)
-        *e = '\0';
-
-      self->description = cwa_strndup (buf, 40);
       size_t l = strlen (self->description);
       if (l >= 39)
         {
@@ -107,11 +183,23 @@ ctgit_repoinfo_new (const char* path)
     }
 
 
+  return self;
+}
 
+void
+ctgit_repoinfo_free (struct ctgit_repo_info* self)
+{
+  if (self)
+    {
+      free (self->path);
+      free (self->name);
 
+      free (self->owner);
+      free (self->description);
+      free (self->giturl);
+      free (self->readme);
 
-
-  self->pull_url = NULL;
-
-  return self;
+      llist_unlink (&self->node);
+      free (self);
+    }
 }
index 96a8135..54a5c97 100644 (file)
 
 #include "ctgit.h"
 
+/*
+  repo options
+*/
+#define CTGIT_CONFS                                                             \
+ CTGIT_CONF(name, "Set the displayed name for the repository")                  \
+ CTGIT_CONF(description, "Set the short description for the repository")        \
+ CTGIT_CONF(giturl, "Set public access url")                                    \
+ CTGIT_CONF(owner, "Set owner name of the repository")                          \
+ CTGIT_CONF(readme, "Set a readme.html file to display")
+
+#define CTGIT_CONF_PREFIX "ctgit."
+
+
+//int
+//ctgit_repo_conf_cb (const char *var, const char *value);
+
 Html
 ctgit_repo_age (struct ctgit_query* query, struct ctgit_repo_info* n);
 
 struct ctgit_repo_info*
-ctgit_repoinfo_new (const char* path);
+ctgit_repoinfo_new (struct ctgit_query* query, const char* path);
+
+void
+ctgit_repoinfo_free (struct ctgit_repo_info* self);
 
 #endif