summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2009-07-31 14:55:27 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2009-07-31 15:41:21 (UTC)
commit46b7abed99e957008c01c02cf612aa526ba92f04 (patch) (unidiff)
tree2cdbfe5281c2ffa645def488d53db0a8b82842f4
parent18dfbdc099c1398016427b6fa7f1a1facb363998 (diff)
downloadcgit-46b7abed99e957008c01c02cf612aa526ba92f04.zip
cgit-46b7abed99e957008c01c02cf612aa526ba92f04.tar.gz
cgit-46b7abed99e957008c01c02cf612aa526ba92f04.tar.bz2
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>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c2
-rw-r--r--cgit.h1
-rw-r--r--cgitrc.5.txt8
-rw-r--r--ui-tree.c18
4 files changed, 25 insertions, 4 deletions
diff --git a/cgit.c b/cgit.c
index 779a464..eb7b45d 100644
--- a/cgit.c
+++ b/cgit.c
@@ -97,12 +97,14 @@ void config_cb(const char *name, const char *value)
97 else if (!strcmp(name, "max-repodesc-length")) 97 else if (!strcmp(name, "max-repodesc-length"))
98 ctx.cfg.max_repodesc_len = atoi(value); 98 ctx.cfg.max_repodesc_len = atoi(value);
99 else if (!strcmp(name, "max-repo-count")) 99 else if (!strcmp(name, "max-repo-count"))
100 ctx.cfg.max_repo_count = atoi(value); 100 ctx.cfg.max_repo_count = atoi(value);
101 else if (!strcmp(name, "max-commit-count")) 101 else if (!strcmp(name, "max-commit-count"))
102 ctx.cfg.max_commit_count = atoi(value); 102 ctx.cfg.max_commit_count = atoi(value);
103 else if (!strcmp(name, "source-filter"))
104 ctx.cfg.source_filter = new_filter(value, 1);
103 else if (!strcmp(name, "summary-log")) 105 else if (!strcmp(name, "summary-log"))
104 ctx.cfg.summary_log = atoi(value); 106 ctx.cfg.summary_log = atoi(value);
105 else if (!strcmp(name, "summary-branches")) 107 else if (!strcmp(name, "summary-branches"))
106 ctx.cfg.summary_branches = atoi(value); 108 ctx.cfg.summary_branches = atoi(value);
107 else if (!strcmp(name, "summary-tags")) 109 else if (!strcmp(name, "summary-tags"))
108 ctx.cfg.summary_tags = atoi(value); 110 ctx.cfg.summary_tags = atoi(value);
diff --git a/cgit.h b/cgit.h
index d0fff1f..f9cf0df 100644
--- a/cgit.h
+++ b/cgit.h
@@ -180,12 +180,13 @@ struct cgit_config {
180 int noheader; 180 int noheader;
181 int renamelimit; 181 int renamelimit;
182 int snapshots; 182 int snapshots;
183 int summary_branches; 183 int summary_branches;
184 int summary_log; 184 int summary_log;
185 int summary_tags; 185 int summary_tags;
186 struct cgit_filter *source_filter;
186}; 187};
187 188
188struct cgit_page { 189struct cgit_page {
189 time_t modified; 190 time_t modified;
190 time_t expires; 191 time_t expires;
191 size_t size; 192 size_t size;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index a207fe0..d420ad4 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -195,12 +195,20 @@ snapshots::
195 "tar" uncompressed tar-file 195 "tar" uncompressed tar-file
196 "tar.gz"gzip-compressed tar-file 196 "tar.gz"gzip-compressed tar-file
197 "tar.bz2"bzip-compressed tar-file 197 "tar.bz2"bzip-compressed tar-file
198 "zip" zip-file 198 "zip" zip-file
199 Default value: none. 199 Default value: none.
200 200
201source-filter::
202 Specifies a command which will be invoked to format plaintext blobs
203 in the tree view. The command will get the blob content on its STDIN
204 and the name of the blob as its only command line argument. The STDOUT
205 from the command will be included verbatim as the blob contents, i.e.
206 this can be used to implement e.g. syntax highlighting. Default value:
207 none.
208
201summary-branches:: 209summary-branches::
202 Specifies the number of branches to display in the repository "summary" 210 Specifies the number of branches to display in the repository "summary"
203 view. Default value: "10". 211 view. Default value: "10".
204 212
205summary-log:: 213summary-log::
206 Specifies the number of log entries to display in the repository 214 Specifies the number of log entries to display in the repository
diff --git a/ui-tree.c b/ui-tree.c
index 553dbaa..816e121 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -12,19 +12,29 @@
12#include "ui-shared.h" 12#include "ui-shared.h"
13 13
14char *curr_rev; 14char *curr_rev;
15char *match_path; 15char *match_path;
16int header = 0; 16int header = 0;
17 17
18static void print_text_buffer(char *buf, unsigned long size) 18static void print_text_buffer(const char *name, char *buf, unsigned long size)
19{ 19{
20 unsigned long lineno, idx; 20 unsigned long lineno, idx;
21 const char *numberfmt = 21 const char *numberfmt =
22 "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n"; 22 "<a class='no' id='n%1$d' name='n%1$d' href='#n%1$d'>%1$d</a>\n";
23 23
24 html("<table summary='blob content' class='blob'>\n"); 24 html("<table summary='blob content' class='blob'>\n");
25 if (ctx.cfg.source_filter) {
26 html("<tr><td class='lines'><pre><code>");
27 ctx.cfg.source_filter->argv[1] = xstrdup(name);
28 cgit_open_filter(ctx.cfg.source_filter);
29 write(STDOUT_FILENO, buf, size);
30 cgit_close_filter(ctx.cfg.source_filter);
31 html("</code></pre></td></tr></table>\n");
32 return;
33 }
34
25 html("<tr><td class='linenumbers'><pre>"); 35 html("<tr><td class='linenumbers'><pre>");
26 idx = 0; 36 idx = 0;
27 lineno = 0; 37 lineno = 0;
28 38
29 if (size) { 39 if (size) {
30 htmlf(numberfmt, ++lineno); 40 htmlf(numberfmt, ++lineno);
@@ -62,13 +72,13 @@ static void print_binary_buffer(char *buf, unsigned long size)
62 html_txt(ascii); 72 html_txt(ascii);
63 html("</td></tr>\n"); 73 html("</td></tr>\n");
64 } 74 }
65 html("</table>\n"); 75 html("</table>\n");
66} 76}
67 77
68static void print_object(const unsigned char *sha1, char *path) 78static void print_object(const unsigned char *sha1, char *path, const char *basename)
69{ 79{
70 enum object_type type; 80 enum object_type type;
71 char *buf; 81 char *buf;
72 unsigned long size; 82 unsigned long size;
73 83
74 type = sha1_object_info(sha1, &size); 84 type = sha1_object_info(sha1, &size);
@@ -90,13 +100,13 @@ static void print_object(const unsigned char *sha1, char *path)
90 curr_rev, path); 100 curr_rev, path);
91 htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1)); 101 htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1));
92 102
93 if (buffer_is_binary(buf, size)) 103 if (buffer_is_binary(buf, size))
94 print_binary_buffer(buf, size); 104 print_binary_buffer(buf, size);
95 else 105 else
96 print_text_buffer(buf, size); 106 print_text_buffer(basename, buf, size);
97} 107}
98 108
99 109
100static int ls_item(const unsigned char *sha1, const char *base, int baselen, 110static int ls_item(const unsigned char *sha1, const char *base, int baselen,
101 const char *pathname, unsigned int mode, int stage, 111 const char *pathname, unsigned int mode, int stage,
102 void *cbdata) 112 void *cbdata)
@@ -210,13 +220,13 @@ static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
210 220
211 if (S_ISDIR(mode)) { 221 if (S_ISDIR(mode)) {
212 state = 1; 222 state = 1;
213 ls_head(); 223 ls_head();
214 return READ_TREE_RECURSIVE; 224 return READ_TREE_RECURSIVE;
215 } else { 225 } else {
216 print_object(sha1, buffer); 226 print_object(sha1, buffer, pathname);
217 return 0; 227 return 0;
218 } 228 }
219 } 229 }
220 ls_item(sha1, base, baselen, pathname, mode, stage, NULL); 230 ls_item(sha1, base, baselen, pathname, mode, stage, NULL);
221 return 0; 231 return 0;
222} 232}