-rw-r--r-- | ui-tree.c | 27 |
1 files changed, 12 insertions, 15 deletions
@@ -41,17 +41,17 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size) else { html("<tr>\n"); } if (ctx.repo->source_filter) { html("<td class='lines'><pre><code>"); ctx.repo->source_filter->argv[1] = xstrdup(name); cgit_open_filter(ctx.repo->source_filter); - write(STDOUT_FILENO, buf, size); + html_raw(buf, size); cgit_close_filter(ctx.repo->source_filter); html("</code></pre></td></tr></table>\n"); return; } html("<td class='lines'><pre><code>"); html_txt(buf); html("</code></pre></td></tr></table>\n"); @@ -62,17 +62,17 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size) static void print_binary_buffer(char *buf, unsigned long size) { unsigned long ofs, idx; static char ascii[ROWLEN + 1]; html("<table summary='blob content' class='bin-blob'>\n"); html("<tr><th>ofs</th><th>hex dump</th><th>ascii</th></tr>"); for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) { - htmlf("<tr><td class='right'>%04x</td><td class='hex'>", ofs); + htmlf("<tr><td class='right'>%04lx</td><td class='hex'>", ofs); for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) htmlf("%*s%02x", idx == 16 ? 4 : 1, "", buf[idx] & 0xff); html(" </td><td class='hex'>"); for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) ascii[idx] = isgraph(buf[idx]) ? buf[idx] : '.'; ascii[idx] = '\0'; @@ -97,20 +97,26 @@ static void print_object(const unsigned char *sha1, char *path, const char *base buf = read_sha1_file(sha1, &type, &size); if (!buf) { cgit_print_error(fmt("Error reading object %s", sha1_to_hex(sha1))); return; } - html(" ("); + htmlf("blob: %s (", sha1_to_hex(sha1)); cgit_plain_link("plain", NULL, NULL, ctx.qry.head, curr_rev, path); - htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1)); + html(")\n"); + + if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) { + htmlf("<div class='error'>blob size (%ldKB) exceeds display size limit (%dKB).</div>", + size / 1024, ctx.cfg.max_blob_size); + return; + } if (buffer_is_binary(buf, size)) print_binary_buffer(buf, size); else print_text_buffer(basename, buf, size); } @@ -164,16 +170,18 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, htmlf("</td><td class='ls-size'>%li</td>", size); html("<td>"); cgit_log_link("log", NULL, "button", ctx.qry.head, curr_rev, fullpath, 0, NULL, NULL, ctx.qry.showmsg); if (ctx.repo->max_stats) cgit_stats_link("stats", NULL, "button", ctx.qry.head, fullpath); + cgit_plain_link("plain", NULL, "button", ctx.qry.head, curr_rev, + fullpath); html("</td></tr>\n"); free(name); return 0; } static void ls_head() { html("<table summary='tree listing' class='list'>\n"); @@ -212,27 +220,20 @@ static void ls_tree(const unsigned char *sha1, char *path) static int walk_tree(const unsigned char *sha1, const char *base, int baselen, const char *pathname, unsigned mode, int stage, void *cbdata) { static int state; static char buffer[PATH_MAX]; - char *url; if (state == 0) { memcpy(buffer, base, baselen); strcpy(buffer+baselen, pathname); - url = cgit_pageurl(ctx.qry.repo, "tree", - fmt("h=%s&path=%s", curr_rev, buffer)); - html("/"); - cgit_tree_link(xstrdup(pathname), NULL, NULL, ctx.qry.head, - curr_rev, buffer); - if (strcmp(match_path, buffer)) return READ_TREE_RECURSIVE; if (S_ISDIR(mode)) { state = 1; ls_head(); return READ_TREE_RECURSIVE; } else { @@ -265,20 +266,16 @@ void cgit_print_tree(const char *rev, char *path) return; } commit = lookup_commit_reference(sha1); if (!commit || parse_commit(commit)) { cgit_print_error(fmt("Invalid commit reference: %s", rev)); return; } - html("path: <a href='"); - html_attr(cgit_pageurl(ctx.qry.repo, "tree", fmt("h=%s", rev))); - html("'>root</a>"); - if (path == NULL) { ls_tree(commit->tree->object.sha1, NULL); return; } match_path = path; read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, NULL); ls_tail(); |