summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2009-08-09 11:45:36 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2009-08-09 11:45:36 (UTC)
commit17e3ff42646f182911fd0e5d872082977538db9e (patch) (unidiff)
tree6fedf480751b534ac11066dd143fd0589cad284a
parentb4c3562f57c924866314d0f80f46dddecd4ce61a (diff)
parentc4d46c7035d07070ac1ebf0c0b44df927358687f (diff)
downloadcgit-17e3ff42646f182911fd0e5d872082977538db9e.zip
cgit-17e3ff42646f182911fd0e5d872082977538db9e.tar.gz
cgit-17e3ff42646f182911fd0e5d872082977538db9e.tar.bz2
Merge branch 'lh/mimetypes'
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c11
-rw-r--r--cgit.h2
-rw-r--r--cgitrc.5.txt17
-rw-r--r--ui-plain.c20
4 files changed, 45 insertions, 5 deletions
diff --git a/cgit.c b/cgit.c
index f6bb0c7..aa1107a 100644
--- a/cgit.c
+++ b/cgit.c
@@ -12,16 +12,24 @@
12#include "configfile.h" 12#include "configfile.h"
13#include "html.h" 13#include "html.h"
14#include "ui-shared.h" 14#include "ui-shared.h"
15#include "ui-stats.h" 15#include "ui-stats.h"
16#include "scan-tree.h" 16#include "scan-tree.h"
17 17
18const char *cgit_version = CGIT_VERSION; 18const char *cgit_version = CGIT_VERSION;
19 19
20void 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
20void config_cb(const char *name, const char *value) 28void config_cb(const char *name, const char *value)
21{ 29{
22 if (!strcmp(name, "root-title")) 30 if (!strcmp(name, "root-title"))
23 ctx.cfg.root_title = xstrdup(value); 31 ctx.cfg.root_title = xstrdup(value);
24 else if (!strcmp(name, "root-desc")) 32 else if (!strcmp(name, "root-desc"))
25 ctx.cfg.root_desc = xstrdup(value); 33 ctx.cfg.root_desc = xstrdup(value);
26 else if (!strcmp(name, "root-readme")) 34 else if (!strcmp(name, "root-readme"))
27 ctx.cfg.root_readme = xstrdup(value); 35 ctx.cfg.root_readme = xstrdup(value);
@@ -98,16 +106,18 @@ void config_cb(const char *name, const char *value)
98 else if (!strcmp(name, "renamelimit")) 106 else if (!strcmp(name, "renamelimit"))
99 ctx.cfg.renamelimit = atoi(value); 107 ctx.cfg.renamelimit = atoi(value);
100 else if (!strcmp(name, "robots")) 108 else if (!strcmp(name, "robots"))
101 ctx.cfg.robots = xstrdup(value); 109 ctx.cfg.robots = xstrdup(value);
102 else if (!strcmp(name, "clone-prefix")) 110 else if (!strcmp(name, "clone-prefix"))
103 ctx.cfg.clone_prefix = xstrdup(value); 111 ctx.cfg.clone_prefix = xstrdup(value);
104 else if (!strcmp(name, "local-time")) 112 else if (!strcmp(name, "local-time"))
105 ctx.cfg.local_time = atoi(value); 113 ctx.cfg.local_time = atoi(value);
114 else if (!prefixcmp(name, "mimetype."))
115 add_mimetype(name + 9, value);
106 else if (!strcmp(name, "repo.group")) 116 else if (!strcmp(name, "repo.group"))
107 ctx.cfg.repo_group = xstrdup(value); 117 ctx.cfg.repo_group = xstrdup(value);
108 else if (!strcmp(name, "repo.url")) 118 else if (!strcmp(name, "repo.url"))
109 ctx.repo = cgit_add_repo(value); 119 ctx.repo = cgit_add_repo(value);
110 else if (!strcmp(name, "repo.name")) 120 else if (!strcmp(name, "repo.name"))
111 ctx.repo->name = xstrdup(value); 121 ctx.repo->name = xstrdup(value);
112 else if (ctx.repo && !strcmp(name, "repo.path")) 122 else if (ctx.repo && !strcmp(name, "repo.path"))
113 ctx.repo->path = trim_end(value, '/'); 123 ctx.repo->path = trim_end(value, '/');
@@ -210,16 +220,17 @@ static void prepare_context(struct cgit_context *ctx)
210 ctx->cfg.summary_tags = 10; 220 ctx->cfg.summary_tags = 10;
211 ctx->page.mimetype = "text/html"; 221 ctx->page.mimetype = "text/html";
212 ctx->page.charset = PAGE_ENCODING; 222 ctx->page.charset = PAGE_ENCODING;
213 ctx->page.filename = NULL; 223 ctx->page.filename = NULL;
214 ctx->page.size = 0; 224 ctx->page.size = 0;
215 ctx->page.modified = time(NULL); 225 ctx->page.modified = time(NULL);
216 ctx->page.expires = ctx->page.modified; 226 ctx->page.expires = ctx->page.modified;
217 ctx->page.etag = NULL; 227 ctx->page.etag = NULL;
228 memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
218} 229}
219 230
220struct refmatch { 231struct refmatch {
221 char *req_ref; 232 char *req_ref;
222 char *first_ref; 233 char *first_ref;
223 int match; 234 int match;
224}; 235};
225 236
diff --git a/cgit.h b/cgit.h
index acb5e8f..1194eb0 100644
--- a/cgit.h
+++ b/cgit.h
@@ -10,16 +10,17 @@
10#include <commit.h> 10#include <commit.h>
11#include <tag.h> 11#include <tag.h>
12#include <diff.h> 12#include <diff.h>
13#include <diffcore.h> 13#include <diffcore.h>
14#include <refs.h> 14#include <refs.h>
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>
21 22
22 23
23/* 24/*
24 * Dateformats used on misc. pages 25 * Dateformats used on misc. pages
25 */ 26 */
@@ -170,16 +171,17 @@ struct cgit_config {
170 int nocache; 171 int nocache;
171 int noplainemail; 172 int noplainemail;
172 int noheader; 173 int noheader;
173 int renamelimit; 174 int renamelimit;
174 int snapshots; 175 int snapshots;
175 int summary_branches; 176 int summary_branches;
176 int summary_log; 177 int summary_log;
177 int summary_tags; 178 int summary_tags;
179 struct string_list mimetypes;
178}; 180};
179 181
180struct cgit_page { 182struct cgit_page {
181 time_t modified; 183 time_t modified;
182 time_t expires; 184 time_t expires;
183 size_t size; 185 size_t size;
184 char *mimetype; 186 char *mimetype;
185 char *charset; 187 char *charset;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 7754923..0412f64 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -142,16 +142,20 @@ max-repodesc-length::
142 Specifies the maximum number of repo description characters to display 142 Specifies the maximum number of repo description characters to display
143 on the repository index page. Default value: "80". 143 on the repository index page. Default value: "80".
144 144
145max-stats:: 145max-stats::
146 Set the default maximum statistics period. Valid values are "week", 146 Set the default maximum statistics period. Valid values are "week",
147 "month", "quarter" and "year". If unspecified, statistics are 147 "month", "quarter" and "year". If unspecified, statistics are
148 disabled. Default value: none. See also: "repo.max-stats". 148 disabled. Default value: none. See also: "repo.max-stats".
149 149
150mimetype.<ext>::
151 Set the mimetype for the specified filename extension. This is used
152 by the `plain` command when returning blob content.
153
150module-link:: 154module-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
152 submodule is printed in a directory listing. The arguments for the 156 submodule is printed in a directory listing. The arguments for the
153 formatstring are the path and SHA1 of the submodule commit. Default 157 formatstring are the path and SHA1 of the submodule commit. Default
154 value: "./?repo=%s&page=commit&id=%s" 158 value: "./?repo=%s&page=commit&id=%s"
155 159
156nocache:: 160nocache::
157 If set to the value "1" caching will be disabled. This settings is 161 If set to the value "1" caching will be disabled. This settings is
@@ -324,16 +328,29 @@ root-desc=tracking the foobar development
324root-readme=/var/www/htdocs/about.html 328root-readme=/var/www/htdocs/about.html
325 329
326 330
327# Allow download of tar.gz, tar.bz2 and zip-files 331# Allow download of tar.gz, tar.bz2 and zip-files
328snapshots=tar.gz tar.bz2 zip 332snapshots=tar.gz tar.bz2 zip
329 333
330 334
331## 335##
336## List of common mimetypes
337##
338
339mimetype.git=image/git
340mimetype.html=text/html
341mimetype.jpg=image/jpeg
342mimetype.jpeg=image/jpeg
343mimetype.pdf=application/pdf
344mimetype.png=image/png
345mimetype.svg=image/svg+xml
346
347
348##
332## List of repositories. 349## List of repositories.
333## PS: Any repositories listed when repo.group is unset will not be 350## PS: Any repositories listed when repo.group is unset will not be
334## displayed under a group heading 351## displayed under a group heading
335## PPS: This list could be kept in a different file (e.g. '/etc/cgitrepos') 352## PPS: This list could be kept in a different file (e.g. '/etc/cgitrepos')
336## and included like this: 353## and included like this:
337## include=/etc/cgitrepos 354## include=/etc/cgitrepos
338## 355##
339 356
diff --git a/ui-plain.c b/ui-plain.c
index 93a3a05..27c6dae 100644
--- a/ui-plain.c
+++ b/ui-plain.c
@@ -12,34 +12,44 @@
12 12
13char *curr_rev; 13char *curr_rev;
14char *match_path; 14char *match_path;
15int match; 15int match;
16 16
17static void print_object(const unsigned char *sha1, const char *path) 17static 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) {
25 html_status(404, "Not found", 0); 26 html_status(404, "Not found", 0);
26 return; 27 return;
27 } 28 }
28 29
29 buf = read_sha1_file(sha1, &type, &size); 30 buf = read_sha1_file(sha1, &type, &size);
30 if (!buf) { 31 if (!buf) {
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);
41 cgit_print_http_headers(&ctx); 51 cgit_print_http_headers(&ctx);
42 html_raw(buf, size); 52 html_raw(buf, size);
43 match = 1; 53 match = 1;
44} 54}
45 55