tree: move layout into page function
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>
This commit is contained in:
джерело
696a33b66f
коміт
9c70c0bfdb
2
cmd.c
2
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(tree, 1, 1, 1, 0),
|
||||
def_cmd(tree, 1, 0, 1, 0),
|
||||
};
|
||||
int i;
|
||||
|
||||
|
23
ui-tree.c
23
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) {
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
cgit_print_layout_start();
|
||||
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)
|
||||
{
|
||||
cgit_print_layout_start();
|
||||
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");
|
||||
cgit_print_layout_end();
|
||||
}
|
||||
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -231,6 +237,7 @@ static int walk_tree(const unsigned char *sha1, struct strbuf *base,
|
||||
ls_head();
|
||||
return READ_TREE_RECURSIVE;
|
||||
} else {
|
||||
walk_tree_ctx->state = 2;
|
||||
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)) {
|
||||
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)) {
|
||||
cgit_print_error("Invalid commit reference: %s", rev);
|
||||
cgit_print_error_page(404, "Not found",
|
||||
"Invalid commit reference: %s", rev);
|
||||
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();
|
||||
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);
|
||||
|
Завантаження…
Посилання в новій задачі
Block a user