ui-tree: add support for source-filter option

This new option is used to specify an external command which will be
executed when displaying blob content in the tree view. Blob content
will be written to STDIN of the filter and STDOUT from the filter
will be included verbatim in the html output from cgit. The file name
of the blob will be passed as the only argument to the filter command.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
Lars Hjemli 2009-07-31 16:55:27 +02:00
förälder 18dfbdc099
incheckning 46b7abed99
4 ändrade filer med 25 tillägg och 4 borttagningar

2
cgit.c
Visa fil

@ -100,6 +100,8 @@ void config_cb(const char *name, const char *value)
ctx.cfg.max_repo_count = atoi(value); ctx.cfg.max_repo_count = atoi(value);
else if (!strcmp(name, "max-commit-count")) else if (!strcmp(name, "max-commit-count"))
ctx.cfg.max_commit_count = atoi(value); ctx.cfg.max_commit_count = atoi(value);
else if (!strcmp(name, "source-filter"))
ctx.cfg.source_filter = new_filter(value, 1);
else if (!strcmp(name, "summary-log")) else if (!strcmp(name, "summary-log"))
ctx.cfg.summary_log = atoi(value); ctx.cfg.summary_log = atoi(value);
else if (!strcmp(name, "summary-branches")) else if (!strcmp(name, "summary-branches"))

1
cgit.h
Visa fil

@ -183,6 +183,7 @@ struct cgit_config {
int summary_branches; int summary_branches;
int summary_log; int summary_log;
int summary_tags; int summary_tags;
struct cgit_filter *source_filter;
}; };
struct cgit_page { struct cgit_page {

Visa fil

@ -198,6 +198,14 @@ snapshots::
"zip" zip-file "zip" zip-file
Default value: none. Default value: none.
source-filter::
Specifies a command which will be invoked to format plaintext blobs
in the tree view. The command will get the blob content on its STDIN
and the name of the blob as its only command line argument. The STDOUT
from the command will be included verbatim as the blob contents, i.e.
this can be used to implement e.g. syntax highlighting. Default value:
none.
summary-branches:: summary-branches::
Specifies the number of branches to display in the repository "summary" Specifies the number of branches to display in the repository "summary"
view. Default value: "10". view. Default value: "10".

Visa fil

@ -15,13 +15,23 @@ char *curr_rev;
char *match_path; char *match_path;
int header = 0; int header = 0;
static void print_text_buffer(char *buf, unsigned long size) static void print_text_buffer(const char *name, char *buf, unsigned long size)
{ {
unsigned long lineno, idx; unsigned long lineno, idx;
const char *numberfmt = const char *numberfmt =
"<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n"; "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
html("<table summary='blob content' class='blob'>\n"); html("<table summary='blob content' class='blob'>\n");
if (ctx.cfg.source_filter) {
html("<tr><td class='lines'><pre><code>");
ctx.cfg.source_filter->argv[1] = xstrdup(name);
cgit_open_filter(ctx.cfg.source_filter);
write(STDOUT_FILENO, buf, size);
cgit_close_filter(ctx.cfg.source_filter);
html("</code></pre></td></tr></table>\n");
return;
}
html("<tr><td class='linenumbers'><pre>"); html("<tr><td class='linenumbers'><pre>");
idx = 0; idx = 0;
lineno = 0; lineno = 0;
@ -65,7 +75,7 @@ static void print_binary_buffer(char *buf, unsigned long size)
html("</table>\n"); html("</table>\n");
} }
static void print_object(const unsigned char *sha1, char *path) static void print_object(const unsigned char *sha1, char *path, const char *basename)
{ {
enum object_type type; enum object_type type;
char *buf; char *buf;
@ -93,7 +103,7 @@ static void print_object(const unsigned char *sha1, char *path)
if (buffer_is_binary(buf, size)) if (buffer_is_binary(buf, size))
print_binary_buffer(buf, size); print_binary_buffer(buf, size);
else else
print_text_buffer(buf, size); print_text_buffer(basename, buf, size);
} }
@ -213,7 +223,7 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
ls_head(); ls_head();
return READ_TREE_RECURSIVE; return READ_TREE_RECURSIVE;
} else { } else {
print_object(sha1, buffer); print_object(sha1, buffer, pathname);
return 0; return 0;
} }
} }