While listing the items in tree view, we collect a list of any filenames that match any tree-readme entries from the config file.
After the tree view has been shown, we iterate through any collected readme files rendering them inline. Signed-off-by: Andy Green <[email protected]> Reviewed-by: John Keeping <[email protected]> --- ui-tree.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/ui-tree.c b/ui-tree.c index 1ccbb22..6ffd4dd 100644 --- a/ui-tree.c +++ b/ui-tree.c @@ -1,6 +1,6 @@ /* ui-tree.c: functions for tree output * - * Copyright (C) 2006-2017 cgit Development Team <[email protected]> + * Copyright (C) 2006-2018 cgit Development Team <[email protected]> * * Licensed under GNU General Public License v2 * (see COPYING for full license text) @@ -12,8 +12,10 @@ #include "ui-shared.h" struct walk_tree_context { + struct object_id inline_oid; char *curr_rev; char *match_path; + char *inline_filename; int state; bool use_render; }; @@ -325,11 +327,19 @@ static int ls_item(const struct object_id *oid, struct strbuf *base, &fullpath); } else { char *ext = strrchr(name, '.'); + strbuf_addstr(&class, "ls-blob"); if (ext) strbuf_addf(&class, " %s", ext + 1); + cgit_tree_link(name, NULL, class.buf, ctx.qry.head, walk_tree_ctx->curr_rev, fullpath.buf); + + if (!walk_tree_ctx->inline_filename && + string_list_has_string(&ctx.repo->inline_readme, name)) { + walk_tree_ctx->inline_filename = xstrdup(pathname); + oidcpy(&walk_tree_ctx->inline_oid, oid); + } } htmlf("</td><td class='ls-size'>%li</td>", size); @@ -367,7 +377,46 @@ static void ls_head(void) static void ls_tail(struct walk_tree_context *walk_tree_ctx) { + struct cgit_filter *render; + enum object_type type; + char *buf, *mimetype; + unsigned long size; + html("</table>\n"); + + if (!walk_tree_ctx->inline_filename) + goto done; + + type = oid_object_info(the_repository, &walk_tree_ctx->inline_oid, &size); + if (type == OBJ_BAD) + goto done; + + buf = read_object_file(&walk_tree_ctx->inline_oid, &type, &size); + if (!buf) + goto done; + + /* create a vertical gap between tree nav / inline */ + html("<table class=\"tabs\"><tr><td></td></tr></table>"); + + render = get_render_for_filename(walk_tree_ctx->inline_filename); + mimetype = render ? NULL : get_mimetype_for_filename( + walk_tree_ctx->inline_filename); + + htmlf("<h2>%s</h2>", walk_tree_ctx->inline_filename); + html("<div class=blob> </div>\n"); + + if (render) + render_buffer(render, walk_tree_ctx->inline_filename, + buf, size); + else if (mimetype) + include_file(walk_tree_ctx->inline_filename, mimetype); + else + print_buffer(walk_tree_ctx->inline_filename, buf, size); + + free(mimetype); + free(buf); + +done: cgit_print_layout_end(); } @@ -478,4 +527,6 @@ void cgit_print_tree(const char *rev, char *path, bool use_render) cleanup: free(walk_tree_ctx.curr_rev); + if (walk_tree_ctx.inline_filename) + free(walk_tree_ctx.inline_filename); } _______________________________________________ CGit mailing list [email protected] https://lists.zx2c4.com/mailman/listinfo/cgit
