-rw-r--r-- | cgit.c | 1 |
1 files changed, 1 insertions, 0 deletions
@@ -1,138 +1,139 @@ /* cgit.c: cgi for the git scm * * Copyright (C) 2006 Lars Hjemli * * Licensed under GNU General Public License v2 * (see COPYING for full license text) */ #include "cgit.h" #include "cmd.h" +#include "ui-shared.h" static int cgit_prepare_cache(struct cacheitem *item) { if (!ctx.repo && ctx.qry.repo) { ctx.page.title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); cgit_print_http_headers(&ctx); cgit_print_docstart(&ctx); cgit_print_pageheader(&ctx); cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo)); cgit_print_docend(); return 0; } if (!ctx.repo) { item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root)); item->ttl = ctx.cfg.cache_root_ttl; return 1; } if (!cgit_cmd) { item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root, cache_safe_filename(ctx.repo->url), cache_safe_filename(ctx.qry.raw))); item->ttl = ctx.cfg.cache_repo_ttl; } else { item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root, cache_safe_filename(ctx.repo->url), ctx.qry.page, cache_safe_filename(ctx.qry.raw))); if (ctx.qry.has_symref) item->ttl = ctx.cfg.cache_dynamic_ttl; else if (ctx.qry.has_sha1) item->ttl = ctx.cfg.cache_static_ttl; else item->ttl = ctx.cfg.cache_repo_ttl; } return 1; } struct refmatch { char *req_ref; char *first_ref; int match; }; int find_current_ref(const char *refname, const unsigned char *sha1, int flags, void *cb_data) { struct refmatch *info; info = (struct refmatch *)cb_data; if (!strcmp(refname, info->req_ref)) info->match = 1; if (!info->first_ref) info->first_ref = xstrdup(refname); return info->match; } char *find_default_branch(struct cgit_repo *repo) { struct refmatch info; info.req_ref = repo->defbranch; info.first_ref = NULL; info.match = 0; for_each_branch_ref(find_current_ref, &info); if (info.match) return info.req_ref; else return info.first_ref; } static int prepare_repo_cmd(struct cgit_context *ctx) { char *tmp; unsigned char sha1[20]; int nongit = 0; setenv("GIT_DIR", ctx->repo->path, 1); setup_git_directory_gently(&nongit); if (nongit) { ctx->page.title = fmt("%s - %s", ctx->cfg.root_title, "config error"); tmp = fmt("Not a git repository: '%s'", ctx->repo->path); ctx->repo = NULL; cgit_print_http_headers(ctx); cgit_print_docstart(ctx); cgit_print_pageheader(ctx); cgit_print_error(tmp); cgit_print_docend(); return 1; } ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); if (!ctx->qry.head) { ctx->qry.head = xstrdup(find_default_branch(ctx->repo)); ctx->repo->defbranch = ctx->qry.head; } if (!ctx->qry.head) { cgit_print_http_headers(ctx); cgit_print_docstart(ctx); cgit_print_pageheader(ctx); cgit_print_error("Repository seems to be empty"); cgit_print_docend(); return 1; } if (get_sha1(ctx->qry.head, sha1)) { tmp = xstrdup(ctx->qry.head); ctx->qry.head = ctx->repo->defbranch; cgit_print_http_headers(ctx); cgit_print_docstart(ctx); cgit_print_pageheader(ctx); cgit_print_error(fmt("Invalid branch: %s", tmp)); cgit_print_docend(); return 1; } return 0; } static void process_request(struct cgit_context *ctx) { struct cgit_cmd *cmd; cmd = cgit_get_cmd(ctx); if (!cmd) { |