Refactored the object deduction code into object.c
authorChristian Thaeter <ct@pipapo.org>
Thu, 7 Feb 2008 08:40:53 +0000 (09:40 +0100)
committerChristian Thaeter <ct@pipapo.org>
Thu, 7 Feb 2008 08:40:53 +0000 (09:40 +0100)
src/actions.c
src/object.c
src/object.h

index b271311..4271617 100644 (file)
@@ -352,64 +352,13 @@ 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);
+  webgit_object_deduce (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");
 
@@ -452,6 +401,7 @@ static Html
 webgit_raw_action (struct webgit_query* query)
 {
   webgit_repo_enter (query);
+  webgit_object_deduce (query);
 
   unsigned char sha1[20];
   if (get_sha1 (query->object, sha1))
index 3165666..ac4eae2 100644 (file)
@@ -46,6 +46,72 @@ webgit_object_link (struct webgit_query* query,
                );
 }
 
+
+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 (S_ISDIR(mode))
+    {
+      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;
+}
+
+/*
+  find and set object from repo/head/commit/path tuple
+*/
+void
+webgit_object_deduce (struct webgit_query* query)
+{
+  if (!query->object && query->repo && query->head && query->path)
+    {
+      unsigned char sha1[20];
+      query_in_flight = query;
+
+      struct tree *tree;
+
+      if (get_sha1 (query->commit, sha1))
+        die ("error: unknown commit");
+
+      tree = parse_tree_indirect (sha1);
+      if (!tree)
+        die("not a tree object");
+
+      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);
+    }
+}
+
+
+
 /*
 //      Local Variables:
 //      mode: C
index cbaa8dc..5f682c9 100644 (file)
@@ -94,6 +94,8 @@ webgit_object_blob_action (struct webgit_repo_info* repo, unsigned char* sha1);
 Html
 webgit_object_tag_action (struct webgit_repo_info* repo, unsigned char* sha1);
 
+void
+webgit_object_deduce (struct webgit_query* query);
 
 #endif