summaryrefslogtreecommitdiffabout
path: root/cgit.c
authorLars Hjemli <hjemli@gmail.com>2009-02-13 19:43:30 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2009-07-25 10:55:15 (UTC)
commitc4d46c7035d07070ac1ebf0c0b44df927358687f (patch) (unidiff)
tree562cf4f01afe78b92b13ad5be5dc01e07db04a66 /cgit.c
parent286a905842dc0bec6d21a614ec4a97c5f19d5bc4 (diff)
downloadcgit-c4d46c7035d07070ac1ebf0c0b44df927358687f.zip
cgit-c4d46c7035d07070ac1ebf0c0b44df927358687f.tar.gz
cgit-c4d46c7035d07070ac1ebf0c0b44df927358687f.tar.bz2
Add support for mime type registration and lookup
This patch makes it possible to register mappings from filename extension to mime type in cgitrc and use this mapping when returning blob content in `plain` view. The reason for adding this mapping to cgitrc (as opposed to parsing something like /etc/mime.types) is to allow quick lookup of a limited number of filename extensions (/etc/mime-types on my machine currently contains over 700 entries). NB: A nice addition to this patch would be to parse /etc/mime.types when `plain` view is requested for a file with an extension for which there is no mapping registered in cgitrc. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'cgit.c') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/cgit.c b/cgit.c
index 2039ab1..4f414c3 100644
--- a/cgit.c
+++ b/cgit.c
@@ -8,24 +8,32 @@
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "cache.h" 10#include "cache.h"
11#include "cmd.h" 11#include "cmd.h"
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);
28 else if (!strcmp(name, "css")) 36 else if (!strcmp(name, "css"))
29 ctx.cfg.css = xstrdup(value); 37 ctx.cfg.css = xstrdup(value);
30 else if (!strcmp(name, "favicon")) 38 else if (!strcmp(name, "favicon"))
31 ctx.cfg.favicon = xstrdup(value); 39 ctx.cfg.favicon = xstrdup(value);
@@ -92,24 +100,26 @@ void config_cb(const char *name, const char *value)
92 else if (!strcmp(name, "summary-tags")) 100 else if (!strcmp(name, "summary-tags"))
93 ctx.cfg.summary_tags = atoi(value); 101 ctx.cfg.summary_tags = atoi(value);
94 else if (!strcmp(name, "agefile")) 102 else if (!strcmp(name, "agefile"))
95 ctx.cfg.agefile = xstrdup(value); 103 ctx.cfg.agefile = xstrdup(value);
96 else if (!strcmp(name, "renamelimit")) 104 else if (!strcmp(name, "renamelimit"))
97 ctx.cfg.renamelimit = atoi(value); 105 ctx.cfg.renamelimit = atoi(value);
98 else if (!strcmp(name, "robots")) 106 else if (!strcmp(name, "robots"))
99 ctx.cfg.robots = xstrdup(value); 107 ctx.cfg.robots = xstrdup(value);
100 else if (!strcmp(name, "clone-prefix")) 108 else if (!strcmp(name, "clone-prefix"))
101 ctx.cfg.clone_prefix = xstrdup(value); 109 ctx.cfg.clone_prefix = xstrdup(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);
106 else if (!strcmp(name, "repo.url")) 116 else if (!strcmp(name, "repo.url"))
107 ctx.repo = cgit_add_repo(value); 117 ctx.repo = cgit_add_repo(value);
108 else if (!strcmp(name, "repo.name")) 118 else if (!strcmp(name, "repo.name"))
109 ctx.repo->name = xstrdup(value); 119 ctx.repo->name = xstrdup(value);
110 else if (ctx.repo && !strcmp(name, "repo.path")) 120 else if (ctx.repo && !strcmp(name, "repo.path"))
111 ctx.repo->path = trim_end(value, '/'); 121 ctx.repo->path = trim_end(value, '/');
112 else if (ctx.repo && !strcmp(name, "repo.clone-url")) 122 else if (ctx.repo && !strcmp(name, "repo.clone-url"))
113 ctx.repo->clone_url = xstrdup(value); 123 ctx.repo->clone_url = xstrdup(value);
114 else if (ctx.repo && !strcmp(name, "repo.desc")) 124 else if (ctx.repo && !strcmp(name, "repo.desc"))
115 ctx.repo->desc = xstrdup(value); 125 ctx.repo->desc = xstrdup(value);
@@ -204,24 +214,25 @@ static void prepare_context(struct cgit_context *ctx)
204 ctx->cfg.root_desc = "a fast webinterface for the git dscm"; 214 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
205 ctx->cfg.script_name = CGIT_SCRIPT_NAME; 215 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
206 ctx->cfg.summary_branches = 10; 216 ctx->cfg.summary_branches = 10;
207 ctx->cfg.summary_log = 10; 217 ctx->cfg.summary_log = 10;
208 ctx->cfg.summary_tags = 10; 218 ctx->cfg.summary_tags = 10;
209 ctx->page.mimetype = "text/html"; 219 ctx->page.mimetype = "text/html";
210 ctx->page.charset = PAGE_ENCODING; 220 ctx->page.charset = PAGE_ENCODING;
211 ctx->page.filename = NULL; 221 ctx->page.filename = NULL;
212 ctx->page.size = 0; 222 ctx->page.size = 0;
213 ctx->page.modified = time(NULL); 223 ctx->page.modified = time(NULL);
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
218struct refmatch { 229struct refmatch {
219 char *req_ref; 230 char *req_ref;
220 char *first_ref; 231 char *first_ref;
221 int match; 232 int match;
222}; 233};
223 234
224int find_current_ref(const char *refname, const unsigned char *sha1, 235int find_current_ref(const char *refname, const unsigned char *sha1,
225 int flags, void *cb_data) 236 int flags, void *cb_data)
226{ 237{
227 struct refmatch *info; 238 struct refmatch *info;