-rw-r--r-- | cgit.c | 11 | ||||
-rw-r--r-- | cgit.h | 2 | ||||
-rw-r--r-- | cgitrc.5.txt | 17 | ||||
-rw-r--r-- | ui-plain.c | 12 |
4 files changed, 41 insertions, 1 deletions
@@ -18,4 +18,12 @@ | |||
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 | void config_cb(const char *name, const char *value) | 28 | void config_cb(const char *name, const char *value) |
21 | { | 29 | { |
@@ -102,4 +110,6 @@ void config_cb(const char *name, const char *value) | |||
102 | else if (!strcmp(name, "local-time")) | 110 | else if (!strcmp(name, "local-time")) |
103 | ctx.cfg.local_time = atoi(value); | 111 | ctx.cfg.local_time = atoi(value); |
112 | else if (!prefixcmp(name, "mimetype.")) | ||
113 | add_mimetype(name + 9, value); | ||
104 | else if (!strcmp(name, "repo.group")) | 114 | else if (!strcmp(name, "repo.group")) |
105 | ctx.cfg.repo_group = xstrdup(value); | 115 | ctx.cfg.repo_group = xstrdup(value); |
@@ -214,4 +224,5 @@ static void prepare_context(struct cgit_context *ctx) | |||
214 | ctx->page.expires = ctx->page.modified; | 224 | ctx->page.expires = ctx->page.modified; |
215 | ctx->page.etag = NULL; | 225 | ctx->page.etag = NULL; |
226 | memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); | ||
216 | } | 227 | } |
217 | 228 | ||
@@ -16,4 +16,5 @@ | |||
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> |
@@ -175,4 +176,5 @@ struct cgit_config { | |||
175 | int summary_log; | 176 | int summary_log; |
176 | int summary_tags; | 177 | int summary_tags; |
178 | struct string_list mimetypes; | ||
177 | }; | 179 | }; |
178 | 180 | ||
diff --git a/cgitrc.5.txt b/cgitrc.5.txt index a207fe0..7256ec0 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt | |||
@@ -148,4 +148,8 @@ max-stats:: | |||
148 | disabled. Default value: none. See also: "repo.max-stats". | 148 | disabled. Default value: none. See also: "repo.max-stats". |
149 | 149 | ||
150 | mimetype.<ext>:: | ||
151 | Set the mimetype for the specified filename extension. This is used | ||
152 | by the `plain` command when returning blob content. | ||
153 | |||
150 | module-link:: | 154 | module-link:: |
151 | Text which will be used as the formatstring for a hyperlink when a | 155 | Text which will be used as the formatstring for a hyperlink when a |
@@ -326,4 +330,17 @@ snapshots=tar.gz tar.bz2 zip | |||
326 | 330 | ||
327 | ## | 331 | ## |
332 | ## List of common mimetypes | ||
333 | ## | ||
334 | |||
335 | mimetype.git=image/git | ||
336 | mimetype.html=text/html | ||
337 | mimetype.jpg=image/jpeg | ||
338 | mimetype.jpeg=image/jpeg | ||
339 | mimetype.pdf=application/pdf | ||
340 | mimetype.png=image/png | ||
341 | mimetype.svg=image/svg+xml | ||
342 | |||
343 | |||
344 | ## | ||
328 | ## List of repositories. | 345 | ## List of repositories. |
329 | ## PS: Any repositories listed when repo.group is unset will not be | 346 | ## PS: Any repositories listed when repo.group is unset will not be |
@@ -18,6 +18,7 @@ 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); |
@@ -32,8 +33,17 @@ static void print_object(const unsigned char *sha1, const char *path) | |||
32 | return; | 33 | return; |
33 | } | 34 | } |
35 | ctx.page.mimetype = NULL; | ||
36 | ext = strrchr(path, '.'); | ||
37 | if (ext && *(++ext)) { | ||
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) { | ||
34 | if (buffer_is_binary(buf, size)) | 43 | if (buffer_is_binary(buf, size)) |
35 | ctx.page.mimetype = "application/octet-stream"; | 44 | ctx.page.mimetype = "application/octet-stream"; |
36 | else | 45 | else |
37 | ctx.page.mimetype = "text/plain"; | 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; |