]> git.cameronkatri.com Git - cgit.git/commitdiff
tree: move layout into page function
authorJohn Keeping <john@keeping.me.uk>
Fri, 14 Aug 2015 11:47:20 +0000 (12:47 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 14 Aug 2015 13:46:51 +0000 (15:46 +0200)
This also allows us to return proper HTTP error codes when the requested
tree is not found and display an error message in one case (invalid path
inside valid commit) where we previously just displayed an empty page.

Signed-off-by: John Keeping <john@keeping.me.uk>
cmd.c
ui-tree.c

diff --git a/cmd.c b/cmd.c
index 54961d99a3ee4abc90a852ee6c6345574d811830..3c90d0b3c3b91718bacdc98cf30f3551ebe7afa4 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -172,7 +172,7 @@ struct cgit_cmd *cgit_get_cmd(void)
                def_cmd(stats, 1, 0, 1, 0),
                def_cmd(summary, 1, 0, 0, 0),
                def_cmd(tag, 1, 0, 0, 0),
                def_cmd(stats, 1, 0, 1, 0),
                def_cmd(summary, 1, 0, 0, 0),
                def_cmd(tag, 1, 0, 0, 0),
-               def_cmd(tree, 1, 1, 1, 0),
+               def_cmd(tree, 1, 0, 1, 0),
        };
        int i;
 
        };
        int i;
 
index 2dbe89ea4faef6b3ac35b9fa6d8aa9d30678f328..1b310d5304b2ebd8c44594e018bc3eb534a6e8f0 100644 (file)
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -92,16 +92,19 @@ static void print_object(const unsigned char *sha1, char *path, const char *base
 
        type = sha1_object_info(sha1, &size);
        if (type == OBJ_BAD) {
 
        type = sha1_object_info(sha1, &size);
        if (type == OBJ_BAD) {
-               cgit_print_error("Bad object name: %s", sha1_to_hex(sha1));
+               cgit_print_error_page(404, "Not found",
+                       "Bad object name: %s", sha1_to_hex(sha1));
                return;
        }
 
        buf = read_sha1_file(sha1, &type, &size);
        if (!buf) {
                return;
        }
 
        buf = read_sha1_file(sha1, &type, &size);
        if (!buf) {
-               cgit_print_error("Error reading object %s", sha1_to_hex(sha1));
+               cgit_print_error_page(500, "Internal server error",
+                       "Error reading object %s", sha1_to_hex(sha1));
                return;
        }
 
                return;
        }
 
+       cgit_print_layout_start();
        htmlf("blob: %s (", sha1_to_hex(sha1));
        cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
                        rev, path);
        htmlf("blob: %s (", sha1_to_hex(sha1));
        cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
                        rev, path);
@@ -181,6 +184,7 @@ static int ls_item(const unsigned char *sha1, struct strbuf *base,
 
 static void ls_head(void)
 {
 
 static void ls_head(void)
 {
+       cgit_print_layout_start();
        html("<table summary='tree listing' class='list'>\n");
        html("<tr class='nohover'>");
        html("<th class='left'>Mode</th>");
        html("<table summary='tree listing' class='list'>\n");
        html("<tr class='nohover'>");
        html("<th class='left'>Mode</th>");
@@ -193,6 +197,7 @@ static void ls_head(void)
 static void ls_tail(void)
 {
        html("</table>\n");
 static void ls_tail(void)
 {
        html("</table>\n");
+       cgit_print_layout_end();
 }
 
 static void ls_tree(const unsigned char *sha1, char *path, struct walk_tree_context *walk_tree_ctx)
 }
 
 static void ls_tree(const unsigned char *sha1, char *path, struct walk_tree_context *walk_tree_ctx)
@@ -204,7 +209,8 @@ static void ls_tree(const unsigned char *sha1, char *path, struct walk_tree_cont
 
        tree = parse_tree_indirect(sha1);
        if (!tree) {
 
        tree = parse_tree_indirect(sha1);
        if (!tree) {
-               cgit_print_error("Not a tree object: %s", sha1_to_hex(sha1));
+               cgit_print_error_page(404, "Not found",
+                       "Not a tree object: %s", sha1_to_hex(sha1));
                return;
        }
 
                return;
        }
 
@@ -231,6 +237,7 @@ static int walk_tree(const unsigned char *sha1, struct strbuf *base,
                        ls_head();
                        return READ_TREE_RECURSIVE;
                } else {
                        ls_head();
                        return READ_TREE_RECURSIVE;
                } else {
+                       walk_tree_ctx->state = 2;
                        print_object(sha1, buffer, pathname, walk_tree_ctx->curr_rev);
                        return 0;
                }
                        print_object(sha1, buffer, pathname, walk_tree_ctx->curr_rev);
                        return 0;
                }
@@ -265,12 +272,14 @@ void cgit_print_tree(const char *rev, char *path)
                rev = ctx.qry.head;
 
        if (get_sha1(rev, sha1)) {
                rev = ctx.qry.head;
 
        if (get_sha1(rev, sha1)) {
-               cgit_print_error("Invalid revision name: %s", rev);
+               cgit_print_error_page(404, "Not found",
+                       "Invalid revision name: %s", rev);
                return;
        }
        commit = lookup_commit_reference(sha1);
        if (!commit || parse_commit(commit)) {
                return;
        }
        commit = lookup_commit_reference(sha1);
        if (!commit || parse_commit(commit)) {
-               cgit_print_error("Invalid commit reference: %s", rev);
+               cgit_print_error_page(404, "Not found",
+                       "Invalid commit reference: %s", rev);
                return;
        }
 
                return;
        }
 
@@ -284,6 +293,10 @@ void cgit_print_tree(const char *rev, char *path)
        read_tree_recursive(commit->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx);
        if (walk_tree_ctx.state == 1)
                ls_tail();
        read_tree_recursive(commit->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx);
        if (walk_tree_ctx.state == 1)
                ls_tail();
+       else if (walk_tree_ctx.state == 2)
+               cgit_print_layout_end();
+       else
+               cgit_print_error_page(404, "Not found", "Path not found");
 
 cleanup:
        free(walk_tree_ctx.curr_rev);
 
 cleanup:
        free(walk_tree_ctx.curr_rev);