summaryrefslogtreecommitdiffabout
path: root/cgit.c
Side-by-side diff
Diffstat (limited to 'cgit.c') (more/less context) (show whitespace changes)
-rw-r--r--cgit.c87
1 files changed, 78 insertions, 9 deletions
diff --git a/cgit.c b/cgit.c
index 5301840..5816f3d 100644
--- a/cgit.c
+++ b/cgit.c
@@ -19,2 +19,25 @@ 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);
+}
+
+struct cgit_filter *new_filter(const char *cmd, int extra_args)
+{
+ struct cgit_filter *f;
+
+ if (!cmd || !cmd[0])
+ return NULL;
+
+ f = xmalloc(sizeof(struct cgit_filter));
+ f->cmd = xstrdup(cmd);
+ f->argv = xmalloc((2 + extra_args) * sizeof(char *));
+ f->argv[0] = f->cmd;
+ f->argv[1] = NULL;
+ return f;
+}
+
void config_cb(const char *name, const char *value)
@@ -33,2 +56,4 @@ void config_cb(const char *name, const char *value)
ctx.cfg.footer = xstrdup(value);
+ else if (!strcmp(name, "head-include"))
+ ctx.cfg.head_include = xstrdup(value);
else if (!strcmp(name, "header"))
@@ -51,2 +76,6 @@ void config_cb(const char *name, const char *value)
ctx.cfg.nocache = atoi(value);
+ else if (!strcmp(name, "noplainemail"))
+ ctx.cfg.noplainemail = atoi(value);
+ else if (!strcmp(name, "noheader"))
+ ctx.cfg.noheader = atoi(value);
else if (!strcmp(name, "snapshots"))
@@ -73,2 +102,8 @@ void config_cb(const char *name, const char *value)
ctx.cfg.cache_dynamic_ttl = atoi(value);
+ else if (!strcmp(name, "about-filter"))
+ ctx.cfg.about_filter = new_filter(value, 0);
+ else if (!strcmp(name, "commit-filter"))
+ ctx.cfg.commit_filter = new_filter(value, 0);
+ else if (!strcmp(name, "embedded"))
+ ctx.cfg.embedded = atoi(value);
else if (!strcmp(name, "max-message-length"))
@@ -81,2 +116,4 @@ void config_cb(const char *name, const char *value)
ctx.cfg.max_commit_count = atoi(value);
+ else if (!strcmp(name, "source-filter"))
+ ctx.cfg.source_filter = new_filter(value, 1);
else if (!strcmp(name, "summary-log"))
@@ -97,2 +134,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"))
@@ -123,2 +162,8 @@ void config_cb(const char *name, const char *value)
ctx.repo->module_link= xstrdup(value);
+ else if (ctx.repo && !strcmp(name, "repo.about-filter"))
+ ctx.repo->about_filter = new_filter(value, 0);
+ else if (ctx.repo && !strcmp(name, "repo.commit-filter"))
+ ctx.repo->commit_filter = new_filter(value, 0);
+ else if (ctx.repo && !strcmp(name, "repo.source-filter"))
+ ctx.repo->source_filter = new_filter(value, 1);
else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) {
@@ -175,2 +220,7 @@ static void querystring_cb(const char *name, const char *value)
+char *xstrdupn(const char *str)
+{
+ return (str ? xstrdup(str) : NULL);
+}
+
static void prepare_context(struct cgit_context *ctx)
@@ -188,3 +238,3 @@ static void prepare_context(struct cgit_context *ctx)
ctx->cfg.css = "/cgit.css";
- ctx->cfg.logo = "/git-logo.png";
+ ctx->cfg.logo = "/cgit.png";
ctx->cfg.local_time = 0;
@@ -205,2 +255,12 @@ static void prepare_context(struct cgit_context *ctx)
ctx->cfg.summary_tags = 10;
+ ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
+ ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
+ ctx->env.https = xstrdupn(getenv("HTTPS"));
+ ctx->env.no_http = xstrdupn(getenv("NO_HTTP"));
+ ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
+ ctx->env.query_string = xstrdupn(getenv("QUERY_STRING"));
+ ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD"));
+ ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME"));
+ ctx->env.server_name = xstrdupn(getenv("SERVER_NAME"));
+ ctx->env.server_port = xstrdupn(getenv("SERVER_PORT"));
ctx->page.mimetype = "text/html";
@@ -211,2 +271,10 @@ static void prepare_context(struct cgit_context *ctx)
ctx->page.expires = ctx->page.modified;
+ ctx->page.etag = NULL;
+ memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
+ if (ctx->env.script_name)
+ ctx->cfg.script_name = ctx->env.script_name;
+ if (ctx->env.query_string)
+ ctx->qry.raw = ctx->env.query_string;
+ if (!ctx->env.cgit_config)
+ ctx->env.cgit_config = CGIT_CONFIG;
}
@@ -290,2 +358,4 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
ctx->qry.head = ctx->repo->defbranch;
+ ctx->page.status = 404;
+ ctx->page.statusmsg = "not found";
cgit_print_http_headers(ctx);
@@ -381,2 +451,5 @@ static void cgit_parse_args(int argc, const char **argv)
}
+ if (!strcmp(argv[i], "--nohttp")) {
+ ctx.env.no_http = "1";
+ }
if (!strncmp(argv[i], "--query=", 8)) {
@@ -433,3 +506,2 @@ int main(int argc, const char **argv)
{
- const char *cgit_config_env = getenv("CGIT_CONFIG");
const char *path;
@@ -443,9 +515,4 @@ int main(int argc, const char **argv)
- if (getenv("SCRIPT_NAME"))
- ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
- if (getenv("QUERY_STRING"))
- ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
cgit_parse_args(argc, argv);
- parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG,
- config_cb);
+ parse_configfile(ctx.env.cgit_config, config_cb);
ctx.repo = NULL;
@@ -464,3 +531,3 @@ int main(int argc, const char **argv)
*/
- path = getenv("PATH_INFO");
+ path = ctx.env.path_info;
if (!ctx.qry.url && path) {
@@ -480,2 +547,4 @@ int main(int argc, const char **argv)
ctx.page.expires += ttl*60;
+ if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD"))
+ ctx.cfg.nocache = 1;
if (ctx.cfg.nocache)