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) (show whitespace changes)
-rw-r--r--cgit.c11
-rw-r--r--cgit.h2
-rw-r--r--cgitrc.5.txt17
-rw-r--r--ui-plain.c12
4 files changed, 41 insertions, 1 deletions
diff --git a/cgit.c b/cgit.c
index f6bb0c7..aa1107a 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);
@@ -94,24 +102,26 @@ void config_cb(const char *name, const char *value)
94 else if (!strcmp(name, "summary-tags")) 102 else if (!strcmp(name, "summary-tags"))
95 ctx.cfg.summary_tags = atoi(value); 103 ctx.cfg.summary_tags = atoi(value);
96 else if (!strcmp(name, "agefile")) 104 else if (!strcmp(name, "agefile"))
97 ctx.cfg.agefile = xstrdup(value); 105 ctx.cfg.agefile = xstrdup(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, '/');
114 else if (ctx.repo && !strcmp(name, "repo.clone-url")) 124 else if (ctx.repo && !strcmp(name, "repo.clone-url"))
115 ctx.repo->clone_url = xstrdup(value); 125 ctx.repo->clone_url = xstrdup(value);
116 else if (ctx.repo && !strcmp(name, "repo.desc")) 126 else if (ctx.repo && !strcmp(name, "repo.desc"))
117 ctx.repo->desc = xstrdup(value); 127 ctx.repo->desc = xstrdup(value);
@@ -206,24 +216,25 @@ static void prepare_context(struct cgit_context *ctx)
206 ctx->cfg.root_desc = "a fast webinterface for the git dscm"; 216 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
207 ctx->cfg.script_name = CGIT_SCRIPT_NAME; 217 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
208 ctx->cfg.summary_branches = 10; 218 ctx->cfg.summary_branches = 10;
209 ctx->cfg.summary_log = 10; 219 ctx->cfg.summary_log = 10;
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
226int find_current_ref(const char *refname, const unsigned char *sha1, 237int find_current_ref(const char *refname, const unsigned char *sha1,
227 int flags, void *cb_data) 238 int flags, void *cb_data)
228{ 239{
229 struct refmatch *info; 240 struct refmatch *info;
diff --git a/cgit.h b/cgit.h
index acb5e8f..1194eb0 100644
--- a/cgit.h
+++ b/cgit.h
@@ -6,24 +6,25 @@
6#include <cache.h> 6#include <cache.h>
7#include <grep.h> 7#include <grep.h>
8#include <object.h> 8#include <object.h>
9#include <tree.h> 9#include <tree.h>
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 */
26#define FMT_LONGDATE "%Y-%m-%d %H:%M:%S (%Z)" 27#define FMT_LONGDATE "%Y-%m-%d %H:%M:%S (%Z)"
27#define FMT_SHORTDATE "%Y-%m-%d" 28#define FMT_SHORTDATE "%Y-%m-%d"
28#define FMT_ATOMDATE "%Y-%m-%dT%H:%M:%SZ" 29#define FMT_ATOMDATE "%Y-%m-%dT%H:%M:%SZ"
29 30
@@ -166,24 +167,25 @@ struct cgit_config {
166 int max_lock_attempts; 167 int max_lock_attempts;
167 int max_msg_len; 168 int max_msg_len;
168 int max_repodesc_len; 169 int max_repodesc_len;
169 int max_stats; 170 int max_stats;
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;
186 char *filename; 188 char *filename;
187 char *etag; 189 char *etag;
188 char *title; 190 char *title;
189 int status; 191 int status;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 7754923..0412f64 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -138,24 +138,28 @@ max-repo-count::
138 Specifies the number of entries to list per page on therepository 138 Specifies the number of entries to list per page on therepository
139 index page. Default value: "50". 139 index page. Default value: "50".
140 140
141max-repodesc-length:: 141max-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
158 deprecated, and will not be honored starting with cgit-1.0. Default 162 deprecated, and will not be honored starting with cgit-1.0. Default
159 value: "0". 163 value: "0".
160 164
161noplainemail:: 165noplainemail::
@@ -320,24 +324,37 @@ root-title=foobar.com git repositories
320root-desc=tracking the foobar development 324root-desc=tracking the foobar development
321 325
322 326
323# Include some more info about foobar.com on the index page 327# Include some more info about foobar.com on the index page
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
340 357
341repo.url=foo 358repo.url=foo
342repo.path=/pub/git/foo.git 359repo.path=/pub/git/foo.git
343repo.desc=the master foo repository 360repo.desc=the master foo repository
diff --git a/ui-plain.c b/ui-plain.c
index 93a3a05..27c6dae 100644
--- a/ui-plain.c
+++ b/ui-plain.c
@@ -8,42 +8,52 @@
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "ui-shared.h" 11#include "ui-shared.h"
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 }
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;
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
46static int walk_tree(const unsigned char *sha1, const char *base, int baselen, 56static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
47 const char *pathname, unsigned mode, int stage, 57 const char *pathname, unsigned mode, int stage,
48 void *cbdata) 58 void *cbdata)
49{ 59{