cgit

commit 9c70c0bfdb71b39f6bae6e0c77bbe40b22d64ff5

Author: John Keeping <john@keeping.me.uk>

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>

 cmd.c | 2 +-
 ui-tree.c | 23 ++++++++++++++++++-----


diff --git a/cmd.c b/cmd.c
index 54961d99a3ee4abc90a852ee6c6345574d811830..3c90d0b3c3b91718bacdc98cf30f3551ebe7afa4 100644
--- a/cmd.c
+++ b/cmd.c
@@ -172,7 +172,7 @@ 		def_cmd(snapshot, 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;
 




diff --git a/ui-tree.c b/ui-tree.c
index 2dbe89ea4faef6b3ac35b9fa6d8aa9d30678f328..1b310d5304b2ebd8c44594e018bc3eb534a6e8f0 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -92,16 +92,19 @@ 	unsigned long size;
 
 	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 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_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 @@ 	};
 
 	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 @@ 			walk_tree_ctx->state = 1;
 			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 @@ 	if (!rev)
 		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 @@
 	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);