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>
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),
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));
+ 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);
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>");
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)
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));
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;
}
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);
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);