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) (side-by-side diff)
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
@@ -19,2 +19,10 @@ const char *cgit_version = CGIT_VERSION;
+void add_mimetype(const char *name, const char *value)
+{
+ struct string_list_item *item;
+
+ item = string_list_insert(xstrdup(name), &ctx.cfg.mimetypes);
+ item->util = xstrdup(value);
+}
+
void config_cb(const char *name, const char *value)
@@ -105,2 +113,4 @@ void config_cb(const char *name, const char *value)
ctx.cfg.local_time = atoi(value);
+ else if (!prefixcmp(name, "mimetype."))
+ add_mimetype(name + 9, value);
else if (!strcmp(name, "repo.group"))
@@ -217,2 +227,3 @@ static void prepare_context(struct cgit_context *ctx)
ctx->page.etag = NULL;
+ memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
}
diff --git a/cgit.h b/cgit.h
index acb5e8f..1194eb0 100644
--- a/cgit.h
+++ b/cgit.h
@@ -17,2 +17,3 @@
#include <archive.h>
+#include <string-list.h>
#include <xdiff-interface.h>
@@ -177,2 +178,3 @@ struct cgit_config {
int summary_tags;
+ struct string_list mimetypes;
};
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 7754923..0412f64 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -149,2 +149,6 @@ max-stats::
+mimetype.<ext>::
+ Set the mimetype for the specified filename extension. This is used
+ by the `plain` command when returning blob content.
+
module-link::
@@ -331,2 +335,15 @@ snapshots=tar.gz tar.bz2 zip
##
+## List of common mimetypes
+##
+
+mimetype.git=image/git
+mimetype.html=text/html
+mimetype.jpg=image/jpeg
+mimetype.jpeg=image/jpeg
+mimetype.pdf=application/pdf
+mimetype.png=image/png
+mimetype.svg=image/svg+xml
+
+
+##
## List of repositories.
diff --git a/ui-plain.c b/ui-plain.c
index 93a3a05..27c6dae 100644
--- a/ui-plain.c
+++ b/ui-plain.c
@@ -19,4 +19,5 @@ static void print_object(const unsigned char *sha1, const char *path)
enum object_type type;
- char *buf;
+ char *buf, *ext;
unsigned long size;
+ struct string_list_item *mime;
@@ -33,6 +34,15 @@ static void print_object(const unsigned char *sha1, const char *path)
}
- if (buffer_is_binary(buf, size))
- ctx.page.mimetype = "application/octet-stream";
- else
- ctx.page.mimetype = "text/plain";
+ ctx.page.mimetype = NULL;
+ ext = strrchr(path, '.');
+ if (ext && *(++ext)) {
+ mime = string_list_lookup(ext, &ctx.cfg.mimetypes);
+ if (mime)
+ ctx.page.mimetype = (char *)mime->util;
+ }
+ if (!ctx.page.mimetype) {
+ if (buffer_is_binary(buf, size))
+ ctx.page.mimetype = "application/octet-stream";
+ else
+ ctx.page.mimetype = "text/plain";
+ }
ctx.page.filename = fmt("%s", path);