[PATCH v2 12/15] ui-tree: render any matching README file in tree view
Andy Green
andy at warmcat.com
Mon Jun 18 04:58:15 CEST 2018
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 <andy at warmcat.com>
---
ui-tree.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 59 insertions(+), 1 deletion(-)
diff --git a/ui-tree.c b/ui-tree.c
index 368cdc5..9f59d18 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 <cgit at lists.zx2c4.com>
+ * Copyright (C) 2006-2018 cgit Development Team <cgit at lists.zx2c4.com>
*
* 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_path;
int state;
bool use_render;
};
@@ -326,11 +328,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_path &&
+ string_list_has_string(&ctx.repo->inline_readme, name)) {
+ walk_tree_ctx->inline_path = xstrdup(pathname);
+ oidcpy(&walk_tree_ctx->inline_oid, oid);
+ }
}
htmlf("</td><td class='ls-size'>%li</td>", size);
@@ -368,7 +378,53 @@ 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, *name;
+ unsigned long size;
+
html("</table>\n");
+
+ if (!walk_tree_ctx->inline_path)
+ 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_path);
+ mimetype = render ? NULL : get_mimetype_for_filename(
+ walk_tree_ctx->inline_path);
+
+ name = strrchr(walk_tree_ctx->inline_path, '/');
+ if (name)
+ name++;
+ else
+ name = walk_tree_ctx->inline_path;
+
+ htmlf("<h2>%s</h2>", name);
+ html("<div class=blob> </div>\n");
+
+ if (render || mimetype) {
+ if (render)
+ render_buffer(render, name, buf, size);
+ else
+ include_file(walk_tree_ctx->inline_path, mimetype);
+ } else {
+ print_buffer(name, buf, size);
+ }
+
+ free(mimetype);
+ free(buf);
+
+done:
cgit_print_layout_end();
}
@@ -479,4 +535,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_path)
+ free(walk_tree_ctx.inline_path);
}
More information about the CGit
mailing list