DWIM based on passed query parameters
authorChristian Thaeter <ct@pipapo.org>
Thu, 7 Feb 2008 07:09:11 +0000 (08:09 +0100)
committerChristian Thaeter <ct@pipapo.org>
Thu, 7 Feb 2008 07:09:11 +0000 (08:09 +0100)
checks which parameters are provided and selects/completes the
intended action to be carried out

src/actions.c
src/webgit.c

index f216970..b271311 100644 (file)
@@ -352,12 +352,64 @@ webgit_diff_action (struct webgit_query* query)
 /*
   pretty printed objects
 */
+static struct webgit_query* query_in_flight = NULL;
+
+static int
+webgit_object_from_path (const unsigned char *sha1, const char *base, int baselen,
+                         const char *name, unsigned mode, int stage)
+{
+  (void) stage;
+  char pathname[PATH_MAX];
+  snprintf (pathname, PATH_MAX-1, "%.*s%s", baselen, base, name);
+
+  if (!strcmp (pathname, query_in_flight->path))
+    {
+      /* found it */
+      free (query_in_flight->object);
+      query_in_flight->object = cwa_strndup (sha1_to_hex (sha1), 40);
+      return -1;
+    }
+
+  if (sha1_object_info (sha1, NULL) == OBJ_TREE)
+    {
+      /* go into subtree? */
+      size_t l = strlen (pathname);
+      if (!strncmp (pathname, query_in_flight->path, l) && query_in_flight->path[l] == '/')
+        return READ_TREE_RECURSIVE;
+    }
+
+  return 0;
+}
+
+
 static Html
 webgit_object_action (struct webgit_query* query)
 {
   struct webgit_repo_info* repo = webgit_repo_enter (query);
 
   unsigned char sha1[20];
+
+  if (!query->object && query->repo && query->head && query->path)
+    {
+      query_in_flight = query;
+
+      struct tree *tree;
+
+      get_sha1 (query->commit, sha1);
+
+      tree = parse_tree_indirect (sha1);
+      if (!tree)
+        die("not a tree object lala");
+
+      if (strlen (query->path) == 0)
+        {
+          free (query_in_flight->object);
+          query_in_flight->object = cwa_strndup (sha1_to_hex (tree->object.sha1), 40);
+        }
+      else
+        read_tree_recursive (tree, "", 0, 0, NULL, webgit_object_from_path);
+    }
+
   if (get_sha1 (query->object, sha1))
     return html("error: unknown object");
 
index 947a285..060d930 100644 (file)
@@ -213,7 +213,6 @@ main (int argc, char**argv)
 
 
   // parse request/query What to show?
-
   query.request = cgi_new ();
 
   cgi_run_query (query.request, webgit_param_dispatch, &query);
@@ -221,12 +220,38 @@ main (int argc, char**argv)
   if (query.count < 0)
     query.count = query.count_def;
 
-  /* TODO: if no object given but repo+path+ref are given then compute object */
+  /* dwim, select/complete actions and parameters */
+  const char* default_action = "object";
+
+  if (!query.repo)
+    default_action = "main";
+  else
+    {
+      if (!query.object)
+        {
+          if (!query.head)
+            {
+              default_action = "summary";
+            }
+          else
+            {
+              if (!query.commit)
+                default_action = "log";
+              else
+                {
+                  if (!query.path)
+                    {
+                      query.object = cwa_strndup (query.commit, SIZE_MAX);
+                    }
+                }
+            }
+        }
+    }
 
-  /* default action is to show the main page with the list of repos */
   if (!query.action)
-    query.action = cwa_strndup ("main", SIZE_MAX);
+    query.action = cwa_strndup (default_action, SIZE_MAX);
 
+  /* initial rxpd check, just a 'global' access tuple */
   if (query.rxpd)
     {
       RxpdClient rxpd = rxpd_client_new (query.rxpd, "webgit/");  /*TODO config rxpd prefix*/
@@ -272,7 +297,6 @@ main (int argc, char**argv)
 
   webgit_login_bakecookie (&query);
 
-
   // generate page
   Html content = webgit_action_dispatch (&query);