#include "cgit.h"
-struct repolist cgit_repolist;
-struct repoinfo *cgit_repo;
+struct cgit_repolist cgit_repolist;
struct cgit_context ctx;
int cgit_cmd;
const char *cgit_version = CGIT_VERSION;
-int htmlfd = 0;
-
void cgit_prepare_context(struct cgit_context *ctx)
{
memset(ctx, 0, sizeof(ctx));
ctx->cfg.robots = "index, nofollow";
ctx->cfg.root_title = "Git repository browser";
ctx->cfg.script_name = CGIT_SCRIPT_NAME;
-}
-
-int cgit_get_cmd_index(const char *cmd)
-{
- static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
- "snapshot", "tag", "refs", "patch", NULL};
- int i;
-
- for(i = 0; cmds[i]; i++)
- if (!strcmp(cmd, cmds[i]))
- return i + 1;
- return 0;
+ ctx->page.mimetype = "text/html";
+ ctx->page.charset = PAGE_ENCODING;
+ ctx->page.filename = NULL;
}
int chk_zero(int result, char *msg)
return result;
}
-struct repoinfo *add_repo(const char *url)
+struct cgit_repo *add_repo(const char *url)
{
- struct repoinfo *ret;
+ struct cgit_repo *ret;
if (++cgit_repolist.count > cgit_repolist.length) {
if (cgit_repolist.length == 0)
cgit_repolist.length *= 2;
cgit_repolist.repos = xrealloc(cgit_repolist.repos,
cgit_repolist.length *
- sizeof(struct repoinfo));
+ sizeof(struct cgit_repo));
}
ret = &cgit_repolist.repos[cgit_repolist.count-1];
return ret;
}
-struct repoinfo *cgit_get_repoinfo(const char *url)
+struct cgit_repo *cgit_get_repoinfo(const char *url)
{
int i;
- struct repoinfo *repo;
+ struct cgit_repo *repo;
for (i=0; i<cgit_repolist.count; i++) {
repo = &cgit_repolist.repos[i];
else if (!strcmp(name, "repo.group"))
ctx.cfg.repo_group = xstrdup(value);
else if (!strcmp(name, "repo.url"))
- cgit_repo = add_repo(value);
+ ctx.repo = add_repo(value);
else if (!strcmp(name, "repo.name"))
- cgit_repo->name = xstrdup(value);
- else if (cgit_repo && !strcmp(name, "repo.path"))
- cgit_repo->path = trim_end(value, '/');
- else if (cgit_repo && !strcmp(name, "repo.clone-url"))
- cgit_repo->clone_url = xstrdup(value);
- else if (cgit_repo && !strcmp(name, "repo.desc"))
- cgit_repo->desc = xstrdup(value);
- else if (cgit_repo && !strcmp(name, "repo.owner"))
- cgit_repo->owner = xstrdup(value);
- else if (cgit_repo && !strcmp(name, "repo.defbranch"))
- cgit_repo->defbranch = xstrdup(value);
- else if (cgit_repo && !strcmp(name, "repo.snapshots"))
- cgit_repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
- else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
- cgit_repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
- else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
- cgit_repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
- else if (cgit_repo && !strcmp(name, "repo.module-link"))
- cgit_repo->module_link= xstrdup(value);
- else if (cgit_repo && !strcmp(name, "repo.readme") && value != NULL) {
+ ctx.repo->name = xstrdup(value);
+ else if (ctx.repo && !strcmp(name, "repo.path"))
+ ctx.repo->path = trim_end(value, '/');
+ else if (ctx.repo && !strcmp(name, "repo.clone-url"))
+ ctx.repo->clone_url = xstrdup(value);
+ else if (ctx.repo && !strcmp(name, "repo.desc"))
+ ctx.repo->desc = xstrdup(value);
+ else if (ctx.repo && !strcmp(name, "repo.owner"))
+ ctx.repo->owner = xstrdup(value);
+ else if (ctx.repo && !strcmp(name, "repo.defbranch"))
+ ctx.repo->defbranch = xstrdup(value);
+ else if (ctx.repo && !strcmp(name, "repo.snapshots"))
+ ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
+ else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount"))
+ ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
+ else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount"))
+ ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
+ else if (ctx.repo && !strcmp(name, "repo.module-link"))
+ ctx.repo->module_link= xstrdup(value);
+ else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) {
if (*value == '/')
- cgit_repo->readme = xstrdup(value);
+ ctx.repo->readme = xstrdup(value);
else
- cgit_repo->readme = xstrdup(fmt("%s/%s", cgit_repo->path, value));
+ ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value));
} else if (!strcmp(name, "include"))
cgit_read_config(value, cgit_global_config_cb);
}
{
if (!strcmp(name,"r")) {
ctx.qry.repo = xstrdup(value);
- cgit_repo = cgit_get_repoinfo(value);
+ ctx.repo = cgit_get_repoinfo(value);
} else if (!strcmp(name, "p")) {
ctx.qry.page = xstrdup(value);
- cgit_cmd = cgit_get_cmd_index(value);
} else if (!strcmp(name, "url")) {
cgit_parse_url(value);
} else if (!strcmp(name, "qt")) {
old_sha1 = commit->parents->item->object.sha1;
cgit_diff_tree(old_sha1, commit->object.sha1, fn, NULL);
}
+
+int cgit_parse_snapshots_mask(const char *str)
+{
+ const struct cgit_snapshot_format *f;
+ static const char *delim = " \t,:/|;";
+ int tl, sl, rv = 0;
+
+ /* favor legacy setting */
+ if(atoi(str))
+ return 1;
+ for(;;) {
+ str += strspn(str,delim);
+ tl = strcspn(str,delim);
+ if (!tl)
+ break;
+ for (f = cgit_snapshot_formats; f->suffix; f++) {
+ sl = strlen(f->suffix);
+ if((tl == sl && !strncmp(f->suffix, str, tl)) ||
+ (tl == sl-1 && !strncmp(f->suffix+1, str, tl-1))) {
+ rv |= f->bit;
+ break;
+ }
+ }
+ str += tl;
+ }
+ return rv;
+}