From mboxrd@z Thu Jan 1 00:00:00 1970 From: john at keeping.me.uk (John Keeping) Date: Sun, 5 Apr 2015 19:31:45 +0100 Subject: [PATCH 16/17] tree: move layout into page function In-Reply-To: <4a6b6be5e33d5d8a0d8ec8d6e8776a895a960b26.1428248621.git.john@keeping.me.uk> References: <4a6b6be5e33d5d8a0d8ec8d6e8776a895a960b26.1428248621.git.john@keeping.me.uk> Message-ID: <20150405183145.GH21452@serenity.lan> On Sun, Apr 05, 2015 at 04:55:02PM +0100, John Keeping wrote: > 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 > --- This breaks displaying file contents in tree view; it needs something like this squashed into it, which has the advantage of making a couple more errors return proper HTTP status codes but indicates how complicated the layout setup in ui-tree.c becomes: diff --git a/ui-tree.c b/ui-tree.c index 4c1f9cb..70ea2ea 100644 --- a/ui-tree.c +++ b/ui-tree.c @@ -93,16 +93,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); @@ -235,6 +238,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; } @@ -290,6 +294,8 @@ 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"); > cmd.c | 2 +- > ui-tree.c | 13 ++++++++++--- > 2 files changed, 11 insertions(+), 4 deletions(-) > > diff --git a/cmd.c b/cmd.c > index 27408f2..6a964b1 100644 > --- a/cmd.c > +++ b/cmd.c > @@ -161,7 +161,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; > > diff --git a/ui-tree.c b/ui-tree.c > index bbc468e..4c1f9cb 100644 > --- a/ui-tree.c > +++ b/ui-tree.c > @@ -182,6 +182,7 @@ static int ls_item(const unsigned char *sha1, struct strbuf *base, > > static void ls_head(void) > { > + cgit_print_layout_start(); > html("\n"); > html(""); > html(""); > @@ -194,6 +195,7 @@ static void ls_head(void) > static void ls_tail(void) > { > html("
Mode
\n"); > + cgit_print_layout_end(); > } > > static void ls_tree(const unsigned char *sha1, char *path, struct walk_tree_context *walk_tree_ctx) > @@ -205,7 +207,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(400, "Bad request", > + "Not a tree object: %s", sha1_to_hex(sha1)); > return; > } > > @@ -266,12 +269,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; > } > > @@ -285,6 +290,8 @@ 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 > + cgit_print_error_page(404, "Not found", "Path not found"); > > cleanup: > free(walk_tree_ctx.curr_rev); > -- > 2.4.0.rc0.173.gb1cefcc > > _______________________________________________ > CGit mailing list > CGit at lists.zx2c4.com > http://lists.zx2c4.com/mailman/listinfo/cgit