aboutsummaryrefslogtreecommitdiffstats
path: root/ui-tree.c
diff options
context:
space:
mode:
authorJohn Keeping2015-08-14 12:47:20 +0100
committerJason A. Donenfeld2015-08-14 15:46:51 +0200
commit9c70c0bfdb71b39f6bae6e0c77bbe40b22d64ff5 (patch)
tree58bdde199abc58de3adde3d24ea47acd93bd577a /ui-tree.c
parent696a33b66f8638d5c3e0464d66760c6d60ff24a5 (diff)
downloadcgit-9c70c0bfdb71b39f6bae6e0c77bbe40b22d64ff5.tar.gz
cgit-9c70c0bfdb71b39f6bae6e0c77bbe40b22d64ff5.tar.bz2
cgit-9c70c0bfdb71b39f6bae6e0c77bbe40b22d64ff5.zip
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>
Diffstat (limited to 'ui-tree.c')
-rw-r--r--ui-tree.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/ui-tree.c b/ui-tree.c
index 2dbe89e..1b310d5 100644
--- 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
92 92
93 type = sha1_object_info(sha1, &size); 93 type = sha1_object_info(sha1, &size);
94 if (type == OBJ_BAD) { 94 if (type == OBJ_BAD) {
95 cgit_print_error("Bad object name: %s", sha1_to_hex(sha1)); 95 cgit_print_error_page(404, "Not found",
96 "Bad object name: %s", sha1_to_hex(sha1));
96 return; 97 return;
97 } 98 }
98 99
99 buf = read_sha1_file(sha1, &type, &size); 100 buf = read_sha1_file(sha1, &type, &size);
100 if (!buf) { 101 if (!buf) {
101 cgit_print_error("Error reading object %s", sha1_to_hex(sha1)); 102 cgit_print_error_page(500, "Internal server error",
103 "Error reading object %s", sha1_to_hex(sha1));
102 return; 104 return;
103 } 105 }
104 106
107 cgit_print_layout_start();
105 htmlf("blob: %s (", sha1_to_hex(sha1)); 108 htmlf("blob: %s (", sha1_to_hex(sha1));
106 cgit_plain_link("plain", NULL, NULL, ctx.qry.head, 109 cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
107 rev, path); 110 rev, path);
@@ -181,6 +184,7 @@ static int ls_item(const unsigned char *sha1, struct strbuf *base,
181 184
182static void ls_head(void) 185static void ls_head(void)
183{ 186{
187 cgit_print_layout_start();
184 html("<table summary='tree listing' class='list'>\n"); 188 html("<table summary='tree listing' class='list'>\n");
185 html("<tr class='nohover'>"); 189 html("<tr class='nohover'>");
186 html("<th class='left'>Mode</th>"); 190 html("<th class='left'>Mode</th>");
@@ -193,6 +197,7 @@ static void ls_head(void)
193static void ls_tail(void) 197static void ls_tail(void)
194{ 198{
195 html("</table>\n"); 199 html("</table>\n");
200 cgit_print_layout_end();
196} 201}
197 202
198static void ls_tree(const unsigned char *sha1, char *path, struct walk_tree_context *walk_tree_ctx) 203static 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
204 209
205 tree = parse_tree_indirect(sha1); 210 tree = parse_tree_indirect(sha1);
206 if (!tree) { 211 if (!tree) {
207 cgit_print_error("Not a tree object: %s", sha1_to_hex(sha1)); 212 cgit_print_error_page(404, "Not found",
213 "Not a tree object: %s", sha1_to_hex(sha1));
208 return; 214 return;
209 } 215 }
210 216
@@ -231,6 +237,7 @@ static int walk_tree(const unsigned char *sha1, struct strbuf *base,
231 ls_head(); 237 ls_head();
232 return READ_TREE_RECURSIVE; 238 return READ_TREE_RECURSIVE;
233 } else { 239 } else {
240 walk_tree_ctx->state = 2;
234 print_object(sha1, buffer, pathname, walk_tree_ctx->curr_rev); 241 print_object(sha1, buffer, pathname, walk_tree_ctx->curr_rev);
235 return 0; 242 return 0;
236 } 243 }
@@ -265,12 +272,14 @@ void cgit_print_tree(const char *rev, char *path)
265 rev = ctx.qry.head; 272 rev = ctx.qry.head;
266 273
267 if (get_sha1(rev, sha1)) { 274 if (get_sha1(rev, sha1)) {
268 cgit_print_error("Invalid revision name: %s", rev); 275 cgit_print_error_page(404, "Not found",
276 "Invalid revision name: %s", rev);
269 return; 277 return;
270 } 278 }
271 commit = lookup_commit_reference(sha1); 279 commit = lookup_commit_reference(sha1);
272 if (!commit || parse_commit(commit)) { 280 if (!commit || parse_commit(commit)) {
273 cgit_print_error("Invalid commit reference: %s", rev); 281 cgit_print_error_page(404, "Not found",
282 "Invalid commit reference: %s", rev);
274 return; 283 return;
275 } 284 }
276 285
@@ -284,6 +293,10 @@ void cgit_print_tree(const char *rev, char *path)
284 read_tree_recursive(commit->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx); 293 read_tree_recursive(commit->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx);
285 if (walk_tree_ctx.state == 1) 294 if (walk_tree_ctx.state == 1)
286 ls_tail(); 295 ls_tail();
296 else if (walk_tree_ctx.state == 2)
297 cgit_print_layout_end();
298 else
299 cgit_print_error_page(404, "Not found", "Path not found");
287 300
288cleanup: 301cleanup:
289 free(walk_tree_ctx.curr_rev); 302 free(walk_tree_ctx.curr_rev);