diff options
-rw-r--r-- | cgit.c | 13 | ||||
-rw-r--r-- | cgit.h | 3 | ||||
-rw-r--r-- | cgitrc.5.txt | 21 | ||||
-rw-r--r-- | ui-atom.c | 2 | ||||
-rw-r--r-- | ui-commit.c | 12 | ||||
-rw-r--r-- | ui-patch.c | 6 | ||||
-rw-r--r-- | ui-plain.c | 20 | ||||
-rw-r--r-- | ui-tag.c | 2 | ||||
-rw-r--r-- | ui-tree.c | 8 |
9 files changed, 74 insertions, 13 deletions
@@ -17,6 +17,14 @@ | |||
17 | 17 | ||
18 | const char *cgit_version = CGIT_VERSION; | 18 | const char *cgit_version = CGIT_VERSION; |
19 | 19 | ||
20 | void add_mimetype(const char *name, const char *value) | ||
21 | { | ||
22 | struct string_list_item *item; | ||
23 | |||
24 | item = string_list_insert(xstrdup(name), &ctx.cfg.mimetypes); | ||
25 | item->util = xstrdup(value); | ||
26 | } | ||
27 | |||
20 | struct cgit_filter *new_filter(const char *cmd, int extra_args) | 28 | struct cgit_filter *new_filter(const char *cmd, int extra_args) |
21 | { | 29 | { |
22 | struct cgit_filter *f; | 30 | struct cgit_filter *f; |
@@ -66,6 +74,8 @@ void config_cb(const char *name, const char *value) | |||
66 | ctx.cfg.virtual_root = ""; | 74 | ctx.cfg.virtual_root = ""; |
67 | } else if (!strcmp(name, "nocache")) | 75 | } else if (!strcmp(name, "nocache")) |
68 | ctx.cfg.nocache = atoi(value); | 76 | ctx.cfg.nocache = atoi(value); |
77 | else if (!strcmp(name, "noplainemail")) | ||
78 | ctx.cfg.noplainemail = atoi(value); | ||
69 | else if (!strcmp(name, "noheader")) | 79 | else if (!strcmp(name, "noheader")) |
70 | ctx.cfg.noheader = atoi(value); | 80 | ctx.cfg.noheader = atoi(value); |
71 | else if (!strcmp(name, "snapshots")) | 81 | else if (!strcmp(name, "snapshots")) |
@@ -120,6 +130,8 @@ void config_cb(const char *name, const char *value) | |||
120 | ctx.cfg.clone_prefix = xstrdup(value); | 130 | ctx.cfg.clone_prefix = xstrdup(value); |
121 | else if (!strcmp(name, "local-time")) | 131 | else if (!strcmp(name, "local-time")) |
122 | ctx.cfg.local_time = atoi(value); | 132 | ctx.cfg.local_time = atoi(value); |
133 | else if (!prefixcmp(name, "mimetype.")) | ||
134 | add_mimetype(name + 9, value); | ||
123 | else if (!strcmp(name, "repo.group")) | 135 | else if (!strcmp(name, "repo.group")) |
124 | ctx.cfg.repo_group = xstrdup(value); | 136 | ctx.cfg.repo_group = xstrdup(value); |
125 | else if (!strcmp(name, "repo.url")) | 137 | else if (!strcmp(name, "repo.url")) |
@@ -236,6 +248,7 @@ static void prepare_context(struct cgit_context *ctx) | |||
236 | ctx->page.modified = time(NULL); | 248 | ctx->page.modified = time(NULL); |
237 | ctx->page.expires = ctx->page.modified; | 249 | ctx->page.expires = ctx->page.modified; |
238 | ctx->page.etag = NULL; | 250 | ctx->page.etag = NULL; |
251 | memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); | ||
239 | } | 252 | } |
240 | 253 | ||
241 | struct refmatch { | 254 | struct refmatch { |
@@ -15,6 +15,7 @@ | |||
15 | #include <revision.h> | 15 | #include <revision.h> |
16 | #include <log-tree.h> | 16 | #include <log-tree.h> |
17 | #include <archive.h> | 17 | #include <archive.h> |
18 | #include <string-list.h> | ||
18 | #include <xdiff-interface.h> | 19 | #include <xdiff-interface.h> |
19 | #include <xdiff/xdiff.h> | 20 | #include <xdiff/xdiff.h> |
20 | #include <utf8.h> | 21 | #include <utf8.h> |
@@ -179,12 +180,14 @@ struct cgit_config { | |||
179 | int max_repodesc_len; | 180 | int max_repodesc_len; |
180 | int max_stats; | 181 | int max_stats; |
181 | int nocache; | 182 | int nocache; |
183 | int noplainemail; | ||
182 | int noheader; | 184 | int noheader; |
183 | int renamelimit; | 185 | int renamelimit; |
184 | int snapshots; | 186 | int snapshots; |
185 | int summary_branches; | 187 | int summary_branches; |
186 | int summary_log; | 188 | int summary_log; |
187 | int summary_tags; | 189 | int summary_tags; |
190 | struct string_list mimetypes; | ||
188 | struct cgit_filter *commit_filter; | 191 | struct cgit_filter *commit_filter; |
189 | struct cgit_filter *source_filter; | 192 | struct cgit_filter *source_filter; |
190 | }; | 193 | }; |
diff --git a/cgitrc.5.txt b/cgitrc.5.txt index ffb3e0f..dc63637 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt | |||
@@ -153,6 +153,10 @@ max-stats:: | |||
153 | "month", "quarter" and "year". If unspecified, statistics are | 153 | "month", "quarter" and "year". If unspecified, statistics are |
154 | disabled. Default value: none. See also: "repo.max-stats". | 154 | disabled. Default value: none. See also: "repo.max-stats". |
155 | 155 | ||
156 | mimetype.<ext>:: | ||
157 | Set the mimetype for the specified filename extension. This is used | ||
158 | by the `plain` command when returning blob content. | ||
159 | |||
156 | module-link:: | 160 | module-link:: |
157 | Text which will be used as the formatstring for a hyperlink when a | 161 | Text which will be used as the formatstring for a hyperlink when a |
158 | submodule is printed in a directory listing. The arguments for the | 162 | submodule is printed in a directory listing. The arguments for the |
@@ -164,6 +168,10 @@ nocache:: | |||
164 | deprecated, and will not be honored starting with cgit-1.0. Default | 168 | deprecated, and will not be honored starting with cgit-1.0. Default |
165 | value: "0". | 169 | value: "0". |
166 | 170 | ||
171 | noplainemail:: | ||
172 | If set to "1" showing full author email adresses will be disabled. | ||
173 | Default value: "0". | ||
174 | |||
167 | noheader:: | 175 | noheader:: |
168 | Flag which, when set to "1", will make cgit omit the standard header | 176 | Flag which, when set to "1", will make cgit omit the standard header |
169 | on all pages. Default value: none. See also: "embedded". | 177 | on all pages. Default value: none. See also: "embedded". |
@@ -345,6 +353,19 @@ snapshots=tar.gz tar.bz2 zip | |||
345 | 353 | ||
346 | 354 | ||
347 | ## | 355 | ## |
356 | ## List of common mimetypes | ||
357 | ## | ||
358 | |||
359 | mimetype.git=image/git | ||
360 | mimetype.html=text/html | ||
361 | mimetype.jpg=image/jpeg | ||
362 | mimetype.jpeg=image/jpeg | ||
363 | mimetype.pdf=application/pdf | ||
364 | mimetype.png=image/png | ||
365 | mimetype.svg=image/svg+xml | ||
366 | |||
367 | |||
368 | ## | ||
348 | ## List of repositories. | 369 | ## List of repositories. |
349 | ## PS: Any repositories listed when repo.group is unset will not be | 370 | ## PS: Any repositories listed when repo.group is unset will not be |
350 | ## displayed under a group heading | 371 | ## displayed under a group heading |
@@ -32,7 +32,7 @@ void add_entry(struct commit *commit, char *host) | |||
32 | html_txt(info->author); | 32 | html_txt(info->author); |
33 | html("</name>\n"); | 33 | html("</name>\n"); |
34 | } | 34 | } |
35 | if (info->author_email) { | 35 | if (info->author_email && !ctx.cfg.noplainemail) { |
36 | mail = xstrdup(info->author_email); | 36 | mail = xstrdup(info->author_email); |
37 | t = strchr(mail, '<'); | 37 | t = strchr(mail, '<'); |
38 | if (t) | 38 | if (t) |
diff --git a/ui-commit.c b/ui-commit.c index 5815b58..d6b73ee 100644 --- a/ui-commit.c +++ b/ui-commit.c | |||
@@ -40,15 +40,19 @@ void cgit_print_commit(char *hex) | |||
40 | html("<table summary='commit info' class='commit-info'>\n"); | 40 | html("<table summary='commit info' class='commit-info'>\n"); |
41 | html("<tr><th>author</th><td>"); | 41 | html("<tr><th>author</th><td>"); |
42 | html_txt(info->author); | 42 | html_txt(info->author); |
43 | html(" "); | 43 | if (!ctx.cfg.noplainemail) { |
44 | html_txt(info->author_email); | 44 | html(" "); |
45 | html_txt(info->author_email); | ||
46 | } | ||
45 | html("</td><td class='right'>"); | 47 | html("</td><td class='right'>"); |
46 | cgit_print_date(info->author_date, FMT_LONGDATE, ctx.cfg.local_time); | 48 | cgit_print_date(info->author_date, FMT_LONGDATE, ctx.cfg.local_time); |
47 | html("</td></tr>\n"); | 49 | html("</td></tr>\n"); |
48 | html("<tr><th>committer</th><td>"); | 50 | html("<tr><th>committer</th><td>"); |
49 | html_txt(info->committer); | 51 | html_txt(info->committer); |
50 | html(" "); | 52 | if (!ctx.cfg.noplainemail) { |
51 | html_txt(info->committer_email); | 53 | html(" "); |
54 | html_txt(info->committer_email); | ||
55 | } | ||
52 | html("</td><td class='right'>"); | 56 | html("</td><td class='right'>"); |
53 | cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time); | 57 | cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time); |
54 | html("</td></tr>\n"); | 58 | html("</td></tr>\n"); |
@@ -108,7 +108,11 @@ void cgit_print_patch(char *hex) | |||
108 | ctx.page.filename = patchname; | 108 | ctx.page.filename = patchname; |
109 | cgit_print_http_headers(&ctx); | 109 | cgit_print_http_headers(&ctx); |
110 | htmlf("From %s Mon Sep 17 00:00:00 2001\n", sha1_to_hex(sha1)); | 110 | htmlf("From %s Mon Sep 17 00:00:00 2001\n", sha1_to_hex(sha1)); |
111 | htmlf("From: %s %s\n", info->author, info->author_email); | 111 | htmlf("From: %s", info->author); |
112 | if (!ctx.cfg.noplainemail) { | ||
113 | htmlf(" %s", info->author_email); | ||
114 | } | ||
115 | html("\n"); | ||
112 | html("Date: "); | 116 | html("Date: "); |
113 | cgit_print_date(info->author_date, "%a, %d %b %Y %H:%M:%S %z%n", ctx.cfg.local_time); | 117 | cgit_print_date(info->author_date, "%a, %d %b %Y %H:%M:%S %z%n", ctx.cfg.local_time); |
114 | htmlf("Subject: %s\n\n", info->subject); | 118 | htmlf("Subject: %s\n\n", info->subject); |
@@ -17,8 +17,9 @@ int match; | |||
17 | static void print_object(const unsigned char *sha1, const char *path) | 17 | static void print_object(const unsigned char *sha1, const char *path) |
18 | { | 18 | { |
19 | enum object_type type; | 19 | enum object_type type; |
20 | char *buf; | 20 | char *buf, *ext; |
21 | unsigned long size; | 21 | unsigned long size; |
22 | struct string_list_item *mime; | ||
22 | 23 | ||
23 | type = sha1_object_info(sha1, &size); | 24 | type = sha1_object_info(sha1, &size); |
24 | if (type == OBJ_BAD) { | 25 | if (type == OBJ_BAD) { |
@@ -31,10 +32,19 @@ static void print_object(const unsigned char *sha1, const char *path) | |||
31 | html_status(404, "Not found", 0); | 32 | html_status(404, "Not found", 0); |
32 | return; | 33 | return; |
33 | } | 34 | } |
34 | if (buffer_is_binary(buf, size)) | 35 | ctx.page.mimetype = NULL; |
35 | ctx.page.mimetype = "application/octet-stream"; | 36 | ext = strrchr(path, '.'); |
36 | else | 37 | if (ext && *(++ext)) { |
37 | ctx.page.mimetype = "text/plain"; | 38 | mime = string_list_lookup(ext, &ctx.cfg.mimetypes); |
39 | if (mime) | ||
40 | ctx.page.mimetype = (char *)mime->util; | ||
41 | } | ||
42 | if (!ctx.page.mimetype) { | ||
43 | if (buffer_is_binary(buf, size)) | ||
44 | ctx.page.mimetype = "application/octet-stream"; | ||
45 | else | ||
46 | ctx.page.mimetype = "text/plain"; | ||
47 | } | ||
38 | ctx.page.filename = fmt("%s", path); | 48 | ctx.page.filename = fmt("%s", path); |
39 | ctx.page.size = size; | 49 | ctx.page.size = size; |
40 | ctx.page.etag = sha1_to_hex(sha1); | 50 | ctx.page.etag = sha1_to_hex(sha1); |
@@ -64,7 +64,7 @@ void cgit_print_tag(char *revname) | |||
64 | if (info->tagger) { | 64 | if (info->tagger) { |
65 | html("<tr><td>Tagged by</td><td>"); | 65 | html("<tr><td>Tagged by</td><td>"); |
66 | html_txt(info->tagger); | 66 | html_txt(info->tagger); |
67 | if (info->tagger_email) { | 67 | if (info->tagger_email && !ctx.cfg.noplainemail) { |
68 | html(" "); | 68 | html(" "); |
69 | html_txt(info->tagger_email); | 69 | html_txt(info->tagger_email); |
70 | } | 70 | } |
@@ -113,6 +113,7 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, | |||
113 | { | 113 | { |
114 | char *name; | 114 | char *name; |
115 | char *fullpath; | 115 | char *fullpath; |
116 | char *class; | ||
116 | enum object_type type; | 117 | enum object_type type; |
117 | unsigned long size = 0; | 118 | unsigned long size = 0; |
118 | 119 | ||
@@ -145,7 +146,12 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, | |||
145 | cgit_tree_link(name, NULL, "ls-dir", ctx.qry.head, | 146 | cgit_tree_link(name, NULL, "ls-dir", ctx.qry.head, |
146 | curr_rev, fullpath); | 147 | curr_rev, fullpath); |
147 | } else { | 148 | } else { |
148 | cgit_tree_link(name, NULL, "ls-blob", ctx.qry.head, | 149 | class = strrchr(name, '.'); |
150 | if (class != NULL) { | ||
151 | class = fmt("ls-blob %s", class + 1); | ||
152 | } else | ||
153 | class = "ls-blob"; | ||
154 | cgit_tree_link(name, NULL, class, ctx.qry.head, | ||
149 | curr_rev, fullpath); | 155 | curr_rev, fullpath); |
150 | } | 156 | } |
151 | htmlf("</td><td class='ls-size'>%li</td>", size); | 157 | htmlf("</td><td class='ls-size'>%li</td>", size); |