X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/48f7b982d3bb52f1307df73ceb6dd4cab3fdcc80..bfe576624541febd6005ad6a4633680369a7dc34:/ui-tree.c diff --git a/ui-tree.c b/ui-tree.c index 75ec9cb..26f06e3 100644 --- a/ui-tree.c +++ b/ui-tree.c @@ -13,7 +13,7 @@ char *curr_rev; char *match_path; -int header = 0; +static int state; static void print_text_buffer(const char *name, char *buf, unsigned long size) { @@ -27,10 +27,10 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size) html("
");
 		idx = 0;
 		lineno = 0;
-	
+
 		if (size) {
 			htmlf(numberfmt, ++lineno);
-			while(idx < size - 1) { // skip absolute last newline
+			while (idx < size - 1) { // skip absolute last newline
 				if (buf[idx] == '\n')
 					htmlf(numberfmt, ++lineno);
 				idx++;
@@ -46,8 +46,10 @@ static void print_text_buffer(const char *name, char *buf, unsigned long size)
 		html("
");
 		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);
+		free(ctx.repo->source_filter->argv[1]);
+		ctx.repo->source_filter->argv[1] = NULL;
 		html("
\n"); return; } @@ -67,7 +69,7 @@ static void print_binary_buffer(char *buf, unsigned long size) html("\n"); html(""); for (ofs = 0; ofs < size; ofs += ROWLEN, buf += ROWLEN) { - htmlf("
ofshex dumpascii
%04x", ofs); + htmlf("
%04lx", ofs); for (idx = 0; idx < ROWLEN && ofs + idx < size; idx++) htmlf("%*s%02x", idx == 16 ? 4 : 1, "", @@ -82,7 +84,7 @@ static void print_binary_buffer(char *buf, unsigned long size) html("
\n"); } -static void print_object(const unsigned char *sha1, char *path, const char *basename) +static void print_object(const unsigned char *sha1, char *path, const char *basename, const char *rev) { enum object_type type; char *buf; @@ -104,11 +106,11 @@ static void print_object(const unsigned char *sha1, char *path, const char *base htmlf("blob: %s (", sha1_to_hex(sha1)); cgit_plain_link("plain", NULL, NULL, ctx.qry.head, - curr_rev, path); + rev, path); html(")\n"); if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) { - htmlf("
blob size (%dKB) exceeds display size limit (%dKB).
", + htmlf("
blob size (%ldKB) exceeds display size limit (%dKB).
", size / 1024, ctx.cfg.max_blob_size); return; } @@ -148,13 +150,7 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, cgit_print_filemode(mode); html(""); if (S_ISGITLINK(mode)) { - htmlf(""); - html_txt(name); - html(""); + cgit_submodule_link("ls-mod", fullpath, sha1_to_hex(sha1)); } else if (S_ISDIR(mode)) { cgit_tree_link(name, NULL, "ls-dir", ctx.qry.head, curr_rev, fullpath); @@ -175,8 +171,9 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, 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); + if (!S_ISGITLINK(mode)) + cgit_plain_link("plain", NULL, "button", ctx.qry.head, curr_rev, + fullpath); html("\n"); free(name); return 0; @@ -191,20 +188,19 @@ static void ls_head() html("Size"); html(""); html("\n"); - header = 1; } static void ls_tail() { - if (!header) - return; html("\n"); - header = 0; } static void ls_tree(const unsigned char *sha1, char *path) { struct tree *tree; + struct pathspec paths = { + .nr = 0 + }; tree = parse_tree_indirect(sha1); if (!tree) { @@ -214,7 +210,7 @@ static void ls_tree(const unsigned char *sha1, char *path) } ls_head(); - read_tree_recursive(tree, "", 0, 1, NULL, ls_item, NULL); + read_tree_recursive(tree, "", 0, 1, &paths, ls_item, NULL); ls_tail(); } @@ -223,12 +219,11 @@ 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]; if (state == 0) { memcpy(buffer, base, baselen); - strcpy(buffer+baselen, pathname); + strcpy(buffer + baselen, pathname); if (strcmp(match_path, buffer)) return READ_TREE_RECURSIVE; @@ -237,7 +232,7 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen, ls_head(); return READ_TREE_RECURSIVE; } else { - print_object(sha1, buffer, pathname); + print_object(sha1, buffer, pathname, curr_rev); return 0; } } @@ -255,7 +250,14 @@ void cgit_print_tree(const char *rev, char *path) { unsigned char sha1[20]; struct commit *commit; - const char *paths[] = {path, NULL}; + struct pathspec_item path_items = { + .match = path, + .len = path ? strlen(path) : 0 + }; + struct pathspec paths = { + .nr = path ? 1 : 0, + .items = &path_items + }; if (!rev) rev = ctx.qry.head; @@ -277,6 +279,8 @@ void cgit_print_tree(const char *rev, char *path) } match_path = path; - read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, NULL); - ls_tail(); + state = 0; + read_tree_recursive(commit->tree, "", 0, 0, &paths, walk_tree, NULL); + if (state == 1) + ls_tail(); }