From d14d77fe95c3b6224b40df9b101dded0deea913c Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 16 Feb 2008 11:53:40 +0100 Subject: Introduce struct cgit_context This struct will hold all the cgit runtime information currently found in a multitude of global variables. The first cleanup removes all querystring-related variables. Signed-off-by: Lars Hjemli --- cache.c | 4 +-- cgit.c | 72 +++++++++++++++++++++++++------------------------- cgit.h | 35 +++++++++++++++---------- parsing.c | 8 +++--- shared.c | 43 ++++++++++-------------------- ui-commit.c | 14 +++++----- ui-diff.c | 6 ++--- ui-log.c | 20 +++++++------- ui-patch.c | 2 +- ui-refs.c | 4 +-- ui-shared.c | 86 ++++++++++++++++++++++++++++++------------------------------ ui-summary.c | 6 ++--- ui-tree.c | 20 +++++++------- 13 files changed, 156 insertions(+), 164 deletions(-) diff --git a/cache.c b/cache.c index 372e38d..b162952 100644 --- a/cache.c +++ b/cache.c @@ -57,10 +57,10 @@ int cache_create_dirs() if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; - if (cgit_query_page) { + if (ctx.qry.page) { path = fmt("%s/%s/%s", cgit_cache_root, cache_safe_filename(cgit_repo->url), - cgit_query_page); + ctx.qry.page); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; } diff --git a/cgit.c b/cgit.c index e8acc03..8a30c3c 100644 --- a/cgit.c +++ b/cgit.c @@ -10,11 +10,11 @@ static int cgit_prepare_cache(struct cacheitem *item) { - if (!cgit_repo && cgit_query_repo) { + if (!cgit_repo && ctx.qry.repo) { char *title = fmt("%s - %s", cgit_root_title, "Bad request"); cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); - cgit_print_error(fmt("Unknown repo: %s", cgit_query_repo)); + cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo)); cgit_print_docend(); return 0; } @@ -28,16 +28,16 @@ static int cgit_prepare_cache(struct cacheitem *item) if (!cgit_cmd) { item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root, cache_safe_filename(cgit_repo->url), - cache_safe_filename(cgit_querystring))); + cache_safe_filename(ctx.qry.raw))); item->ttl = cgit_cache_repo_ttl; } else { item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root, cache_safe_filename(cgit_repo->url), - cgit_query_page, - cache_safe_filename(cgit_querystring))); - if (cgit_query_has_symref) + ctx.qry.page, + cache_safe_filename(ctx.qry.raw))); + if (ctx.qry.has_symref) item->ttl = cgit_cache_dynamic_ttl; - else if (cgit_query_has_sha1) + else if (ctx.qry.has_sha1) item->ttl = cgit_cache_static_ttl; else item->ttl = cgit_cache_repo_ttl; @@ -98,12 +98,12 @@ static void cgit_print_repo_page(struct cacheitem *item) show_search = 0; setenv("GIT_DIR", cgit_repo->path, 1); - if (!cgit_query_head) { - cgit_query_head = xstrdup(find_default_branch(cgit_repo)); - cgit_repo->defbranch = cgit_query_head; + if (!ctx.qry.head) { + ctx.qry.head = xstrdup(find_default_branch(cgit_repo)); + cgit_repo->defbranch = ctx.qry.head; } - if (!cgit_query_head) { + if (!ctx.qry.head) { cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); cgit_print_error("Repository seems to be empty"); @@ -111,9 +111,9 @@ static void cgit_print_repo_page(struct cacheitem *item) return; } - if (get_sha1(cgit_query_head, sha1)) { - tmp = xstrdup(cgit_query_head); - cgit_query_head = cgit_repo->defbranch; + if (get_sha1(ctx.qry.head, sha1)) { + tmp = xstrdup(ctx.qry.head); + ctx.qry.head = cgit_repo->defbranch; cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); cgit_print_error(fmt("Invalid branch: %s", tmp)); @@ -122,20 +122,20 @@ static void cgit_print_repo_page(struct cacheitem *item) } if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) { - cgit_print_snapshot(item, cgit_query_head, cgit_query_sha1, + cgit_print_snapshot(item, ctx.qry.head, ctx.qry.sha1, cgit_repobasename(cgit_repo->url), - cgit_query_path, + ctx.qry.path, cgit_repo->snapshots ); return; } if (cgit_cmd == CMD_PATCH) { - cgit_print_patch(cgit_query_sha1, item); + cgit_print_patch(ctx.qry.sha1, item); return; } if (cgit_cmd == CMD_BLOB) { - cgit_print_blob(item, cgit_query_sha1, cgit_query_path); + cgit_print_blob(item, ctx.qry.sha1, ctx.qry.path); return; } @@ -148,28 +148,28 @@ static void cgit_print_repo_page(struct cacheitem *item) return; } - cgit_print_pageheader(cgit_query_page, show_search); + cgit_print_pageheader(ctx.qry.page, show_search); switch(cgit_cmd) { case CMD_LOG: - cgit_print_log(cgit_query_sha1, cgit_query_ofs, - cgit_max_commit_count, cgit_query_grep, cgit_query_search, - cgit_query_path, 1); + cgit_print_log(ctx.qry.sha1, ctx.qry.ofs, + cgit_max_commit_count, ctx.qry.grep, ctx.qry.search, + ctx.qry.path, 1); break; case CMD_TREE: - cgit_print_tree(cgit_query_sha1, cgit_query_path); + cgit_print_tree(ctx.qry.sha1, ctx.qry.path); break; case CMD_COMMIT: - cgit_print_commit(cgit_query_sha1); + cgit_print_commit(ctx.qry.sha1); break; case CMD_REFS: cgit_print_refs(); break; case CMD_TAG: - cgit_print_tag(cgit_query_sha1); + cgit_print_tag(ctx.qry.sha1); break; case CMD_DIFF: - cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path); + cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path); break; default: cgit_print_error("Invalid request"); @@ -264,24 +264,24 @@ static void cgit_parse_args(int argc, const char **argv) cgit_nocache = 1; } if (!strncmp(argv[i], "--query=", 8)) { - cgit_querystring = xstrdup(argv[i]+8); + ctx.qry.raw = xstrdup(argv[i]+8); } if (!strncmp(argv[i], "--repo=", 7)) { - cgit_query_repo = xstrdup(argv[i]+7); + ctx.qry.repo = xstrdup(argv[i]+7); } if (!strncmp(argv[i], "--page=", 7)) { - cgit_query_page = xstrdup(argv[i]+7); + ctx.qry.page = xstrdup(argv[i]+7); } if (!strncmp(argv[i], "--head=", 7)) { - cgit_query_head = xstrdup(argv[i]+7); - cgit_query_has_symref = 1; + ctx.qry.head = xstrdup(argv[i]+7); + ctx.qry.has_symref = 1; } if (!strncmp(argv[i], "--sha1=", 7)) { - cgit_query_sha1 = xstrdup(argv[i]+7); - cgit_query_has_sha1 = 1; + ctx.qry.sha1 = xstrdup(argv[i]+7); + ctx.qry.has_sha1 = 1; } if (!strncmp(argv[i], "--ofs=", 6)) { - cgit_query_ofs = atoi(argv[i]+6); + ctx.qry.ofs = atoi(argv[i]+6); } } } @@ -303,9 +303,9 @@ int main(int argc, const char **argv) if (getenv("SCRIPT_NAME")) cgit_script_name = xstrdup(getenv("SCRIPT_NAME")); if (getenv("QUERY_STRING")) - cgit_querystring = xstrdup(getenv("QUERY_STRING")); + ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); cgit_parse_args(argc, argv); - cgit_parse_query(cgit_querystring, cgit_querystring_cb); + cgit_parse_query(ctx.qry.raw, cgit_querystring_cb); if (!cgit_prepare_cache(&item)) return 0; if (cgit_nocache) { diff --git a/cgit.h b/cgit.h index 66c40b9..4576efb 100644 --- a/cgit.h +++ b/cgit.h @@ -123,10 +123,31 @@ struct reflist { int count; }; +struct cgit_query { + int has_symref; + int has_sha1; + char *raw; + char *repo; + char *page; + char *search; + char *grep; + char *head; + char *sha1; + char *sha2; + char *path; + char *name; + int ofs; +}; + +struct cgit_context { + struct cgit_query qry; +}; + extern const char *cgit_version; extern struct repolist cgit_repolist; extern struct repoinfo *cgit_repo; +extern struct cgit_context ctx; extern int cgit_cmd; extern char *cgit_root_title; @@ -163,20 +184,6 @@ extern int cgit_max_msg_len; extern int cgit_max_repodesc_len; extern int cgit_max_commit_count; -extern int cgit_query_has_symref; -extern int cgit_query_has_sha1; - -extern char *cgit_querystring; -extern char *cgit_query_repo; -extern char *cgit_query_page; -extern char *cgit_query_search; -extern char *cgit_query_grep; -extern char *cgit_query_head; -extern char *cgit_query_sha1; -extern char *cgit_query_sha2; -extern char *cgit_query_path; -extern char *cgit_query_name; -extern int cgit_query_ofs; extern int htmlfd; diff --git a/parsing.c b/parsing.c index 5093b8b..8cf56a4 100644 --- a/parsing.c +++ b/parsing.c @@ -149,7 +149,7 @@ void cgit_parse_url(const char *url) cgit_repo = cgit_get_repoinfo(url); if (cgit_repo) { - cgit_query_repo = cgit_repo->url; + ctx.qry.repo = cgit_repo->url; return; } @@ -163,15 +163,15 @@ void cgit_parse_url(const char *url) continue; } - cgit_query_repo = cgit_repo->url; + ctx.qry.repo = cgit_repo->url; p = strchr(cmd + 1, '/'); if (p) { p[0] = '\0'; if (p[1]) - cgit_query_path = trim_end(p + 1, '/'); + ctx.qry.path = trim_end(p + 1, '/'); } cgit_cmd = cgit_get_cmd_index(cmd + 1); - cgit_query_page = xstrdup(cmd + 1); + ctx.qry.page = xstrdup(cmd + 1); return; } } diff --git a/shared.c b/shared.c index f063894..6c1a762 100644 --- a/shared.c +++ b/shared.c @@ -10,6 +10,7 @@ struct repolist cgit_repolist; struct repoinfo *cgit_repo; +struct cgit_context ctx; int cgit_cmd; const char *cgit_version = CGIT_VERSION; @@ -49,24 +50,8 @@ int cgit_max_msg_len = 60; int cgit_max_repodesc_len = 60; int cgit_max_commit_count = 50; -int cgit_query_has_symref = 0; -int cgit_query_has_sha1 = 0; - -char *cgit_querystring = NULL; -char *cgit_query_repo = NULL; -char *cgit_query_page = NULL; -char *cgit_query_head = NULL; -char *cgit_query_search = NULL; -char *cgit_query_grep = NULL; -char *cgit_query_sha1 = NULL; -char *cgit_query_sha2 = NULL; -char *cgit_query_path = NULL; -char *cgit_query_name = NULL; -int cgit_query_ofs = 0; - int htmlfd = 0; - int cgit_get_cmd_index(const char *cmd) { static char *cmds[] = {"log", "commit", "diff", "tree", "blob", @@ -239,32 +224,32 @@ void cgit_global_config_cb(const char *name, const char *value) void cgit_querystring_cb(const char *name, const char *value) { if (!strcmp(name,"r")) { - cgit_query_repo = xstrdup(value); + ctx.qry.repo = xstrdup(value); cgit_repo = cgit_get_repoinfo(value); } else if (!strcmp(name, "p")) { - cgit_query_page = xstrdup(value); + 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")) { - cgit_query_grep = xstrdup(value); + ctx.qry.grep = xstrdup(value); } else if (!strcmp(name, "q")) { - cgit_query_search = xstrdup(value); + ctx.qry.search = xstrdup(value); } else if (!strcmp(name, "h")) { - cgit_query_head = xstrdup(value); - cgit_query_has_symref = 1; + ctx.qry.head = xstrdup(value); + ctx.qry.has_symref = 1; } else if (!strcmp(name, "id")) { - cgit_query_sha1 = xstrdup(value); - cgit_query_has_sha1 = 1; + ctx.qry.sha1 = xstrdup(value); + ctx.qry.has_sha1 = 1; } else if (!strcmp(name, "id2")) { - cgit_query_sha2 = xstrdup(value); - cgit_query_has_sha1 = 1; + ctx.qry.sha2 = xstrdup(value); + ctx.qry.has_sha1 = 1; } else if (!strcmp(name, "ofs")) { - cgit_query_ofs = atoi(value); + ctx.qry.ofs = atoi(value); } else if (!strcmp(name, "path")) { - cgit_query_path = trim_end(value, '/'); + ctx.qry.path = trim_end(value, '/'); } else if (!strcmp(name, "name")) { - cgit_query_name = xstrdup(value); + ctx.qry.name = xstrdup(value); } } diff --git a/ui-commit.c b/ui-commit.c index bd55a33..3b0919b 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -75,7 +75,7 @@ void print_fileinfo(struct fileinfo *info) html("]"); } htmlf("", class); - cgit_diff_link(info->new_path, NULL, NULL, cgit_query_head, curr_rev, + cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, curr_rev, NULL, info->new_path); if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED) htmlf(" (%s from %s)", @@ -143,7 +143,7 @@ void cgit_print_commit(char *hex) int i; if (!hex) - hex = cgit_query_head; + hex = ctx.qry.head; curr_rev = hex; if (get_sha1(hex, sha1)) { @@ -175,7 +175,7 @@ void cgit_print_commit(char *hex) html("tree"); tmp = xstrdup(hex); cgit_tree_link(sha1_to_hex(commit->tree->object.sha1), NULL, NULL, - cgit_query_head, tmp, NULL); + ctx.qry.head, tmp, NULL); html("\n"); for (p = commit->parents; p ; p = p->next) { parent = lookup_commit_reference(p->item->object.sha1); @@ -188,15 +188,15 @@ void cgit_print_commit(char *hex) html("parent" ""); cgit_commit_link(sha1_to_hex(p->item->object.sha1), NULL, NULL, - cgit_query_head, sha1_to_hex(p->item->object.sha1)); + ctx.qry.head, sha1_to_hex(p->item->object.sha1)); html(" ("); - cgit_diff_link("diff", NULL, NULL, cgit_query_head, hex, + cgit_diff_link("diff", NULL, NULL, ctx.qry.head, hex, sha1_to_hex(p->item->object.sha1), NULL); html(")"); } if (cgit_repo->snapshots) { html("download"); - cgit_print_snapshot_links(cgit_query_repo, cgit_query_head, + cgit_print_snapshot_links(ctx.qry.repo, ctx.qry.head, hex, cgit_repo->snapshots); html(""); } @@ -218,7 +218,7 @@ void cgit_print_commit(char *hex) html("
"); htmlf("%d files changed, %d insertions, %d deletions (", files, total_adds, total_rems); - cgit_diff_link("show diff", NULL, NULL, cgit_query_head, hex, + cgit_diff_link("show diff", NULL, NULL, ctx.qry.head, hex, NULL, NULL); html(")
"); } diff --git a/ui-diff.c b/ui-diff.c index 4fcf852..263a7ba 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -71,13 +71,13 @@ static void header(unsigned char *sha1, char *path1, int mode1, } html("
--- a/"); if (mode1 != 0) - cgit_tree_link(path1, NULL, NULL, cgit_query_head, + cgit_tree_link(path1, NULL, NULL, ctx.qry.head, sha1_to_hex(old_rev_sha1), path1); else html_txt(path1); html("
+++ b/"); if (mode2 != 0) - cgit_tree_link(path2, NULL, NULL, cgit_query_head, + cgit_tree_link(path2, NULL, NULL, ctx.qry.head, sha1_to_hex(new_rev_sha1), path2); else html_txt(path2); @@ -107,7 +107,7 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi struct commit *commit, *commit2; if (!new_rev) - new_rev = cgit_query_head; + new_rev = ctx.qry.head; get_sha1(new_rev, new_rev_sha1); type = sha1_object_info(new_rev_sha1, &size); if (type == OBJ_BAD) { diff --git a/ui-log.c b/ui-log.c index a41d2b2..a39474b 100644 --- a/ui-log.c +++ b/ui-log.c @@ -37,7 +37,7 @@ void print_commit(struct commit *commit) html(""); cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); html(""); - cgit_commit_link(info->subject, NULL, NULL, cgit_query_head, + cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, sha1_to_hex(commit->object.sha1)); if (cgit_repo->enable_log_filecount) { files = 0; @@ -67,7 +67,7 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern int i; if (!tip) - argv[1] = cgit_query_head; + argv[1] = ctx.qry.head; if (grep && pattern && (!strcmp(grep, "grep") || !strcmp(grep, "author") || @@ -123,17 +123,17 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern if (pager) { html("
"); if (ofs > 0) { - cgit_log_link("[prev]", NULL, NULL, cgit_query_head, - cgit_query_sha1, cgit_query_path, - ofs - cnt, cgit_query_grep, - cgit_query_search); + cgit_log_link("[prev]", NULL, NULL, ctx.qry.head, + ctx.qry.sha1, ctx.qry.path, + ofs - cnt, ctx.qry.grep, + ctx.qry.search); html(" "); } if ((commit = get_revision(&rev)) != NULL) { - cgit_log_link("[next]", NULL, NULL, cgit_query_head, - cgit_query_sha1, cgit_query_path, - ofs + cnt, cgit_query_grep, - cgit_query_search); + cgit_log_link("[next]", NULL, NULL, ctx.qry.head, + ctx.qry.sha1, ctx.qry.path, + ofs + cnt, ctx.qry.grep, + ctx.qry.search); } html("
"); } diff --git a/ui-patch.c b/ui-patch.c index e7a010a..1da0a27 100644 --- a/ui-patch.c +++ b/ui-patch.c @@ -76,7 +76,7 @@ void cgit_print_patch(char *hex, struct cacheitem *item) char *patchname; if (!hex) - hex = cgit_query_head; + hex = ctx.qry.head; if (get_sha1(hex, sha1)) { cgit_print_error(fmt("Bad object id: %s", hex)); diff --git a/ui-refs.c b/ui-refs.c index 295f5ba..ba513c1 100644 --- a/ui-refs.c +++ b/ui-refs.c @@ -16,9 +16,9 @@ void cgit_print_refs() html(""); - if (cgit_query_path && !strncmp(cgit_query_path, "heads", 5)) + if (ctx.qry.path && !strncmp(ctx.qry.path, "heads", 5)) cgit_print_branches(0); - else if (cgit_query_path && !strncmp(cgit_query_path, "tags", 4)) + else if (ctx.qry.path && !strncmp(ctx.qry.path, "tags", 4)) cgit_print_tags(0); else { cgit_print_branches(0); diff --git a/ui-shared.c b/ui-shared.c index 60aa2e3..6a41fb0 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -112,10 +112,10 @@ char *cgit_currurl() { if (!cgit_virtual_root) return cgit_script_name; - else if (cgit_query_page) - return fmt("%s/%s/%s/", cgit_virtual_root, cgit_query_repo, cgit_query_page); - else if (cgit_query_repo) - return fmt("%s/%s/", cgit_virtual_root, cgit_query_repo); + else if (ctx.qry.page) + return fmt("%s/%s/%s/", cgit_virtual_root, ctx.qry.repo, ctx.qry.page); + else if (ctx.qry.repo) + return fmt("%s/%s/", cgit_virtual_root, ctx.qry.repo); else return fmt("%s/", cgit_virtual_root); } @@ -179,7 +179,7 @@ static void reporevlink(char *page, char *name, char *title, char *class, char *delim; delim = repolink(title, class, page, head, path); - if (rev && strcmp(rev, cgit_query_head)) { + if (rev && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); html_attr(rev); @@ -201,7 +201,7 @@ void cgit_log_link(char *name, char *title, char *class, char *head, char *delim; delim = repolink(title, class, "log", head, path); - if (rev && strcmp(rev, cgit_query_head)) { + if (rev && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); html_attr(rev); @@ -256,7 +256,7 @@ void cgit_diff_link(char *name, char *title, char *class, char *head, char *delim; delim = repolink(title, class, "diff", head, path); - if (new_rev && strcmp(new_rev, cgit_query_head)) { + if (new_rev && strcmp(new_rev, ctx.qry.head)) { html(delim); html("id="); html_attr(new_rev); @@ -284,7 +284,7 @@ void cgit_object_link(struct object *obj) if (obj->type == OBJ_COMMIT) { cgit_commit_link(fmt("commit %s", sha1_to_hex(obj->sha1)), NULL, NULL, - cgit_query_head, sha1_to_hex(obj->sha1)); + ctx.qry.head, sha1_to_hex(obj->sha1)); return; } else if (obj->type == OBJ_TREE) { page = "tree"; @@ -297,7 +297,7 @@ void cgit_object_link(struct object *obj) arg = "id"; } - url = cgit_pageurl(cgit_query_repo, page, + url = cgit_pageurl(ctx.qry.repo, page, fmt("%s=%s", arg, sha1_to_hex(obj->sha1))); html_link_open(url, NULL, NULL); htmlf("%s %s", typename(obj->type), @@ -392,7 +392,7 @@ int print_branch_option(const char *refname, const unsigned char *sha1, int flags, void *cb_data) { char *name = (char *)refname; - html_option(name, name, cgit_query_head); + html_option(name, name, ctx.qry.head); return 0; } @@ -426,7 +426,7 @@ int print_archive_ref(const char *refname, const unsigned char *sha1, html("

download

\n"); *header = 1; } - url = cgit_pageurl(cgit_query_repo, "blob", + url = cgit_pageurl(ctx.qry.repo, "blob", fmt("id=%s&path=%s", sha1_to_hex(fileid), buf)); html_link_open(url, NULL, "menu"); @@ -440,25 +440,25 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page) char *url; if (!cgit_virtual_root) { - url = fmt("%s/%s", cgit_query_repo, page); - if (cgit_query_path) - url = fmt("%s/%s", url, cgit_query_path); + url = fmt("%s/%s", ctx.qry.repo, page); + if (ctx.qry.path) + url = fmt("%s/%s", url, ctx.qry.path); html_hidden("url", url); } - if (incl_head && strcmp(cgit_query_head, cgit_repo->defbranch)) - html_hidden("h", cgit_query_head); + if (incl_head && strcmp(ctx.qry.head, cgit_repo->defbranch)) + html_hidden("h", ctx.qry.head); - if (cgit_query_sha1) - html_hidden("id", cgit_query_sha1); - if (cgit_query_sha2) - html_hidden("id2", cgit_query_sha2); + if (ctx.qry.sha1) + html_hidden("id", ctx.qry.sha1); + if (ctx.qry.sha2) + html_hidden("id2", ctx.qry.sha2); if (incl_search) { - if (cgit_query_grep) - html_hidden("qt", cgit_query_grep); - if (cgit_query_search) - html_hidden("q", cgit_query_search); + if (ctx.qry.grep) + html_hidden("qt", ctx.qry.grep); + if (ctx.qry.search) + html_hidden("q", ctx.qry.search); } } @@ -476,7 +476,7 @@ void cgit_print_pageheader(char *title, int show_search) htmlf("'>cgit\n", cgit_logo); html("\n" ""); - if (cgit_repo->enable_log_filecount) { + if (ctx.repo->enable_log_filecount) { html(""); - if (cgit_repo->enable_log_linecount) + if (ctx.repo->enable_log_linecount) html(""); } html("\n"); diff --git a/ui-repolist.c b/ui-repolist.c index a6cc2cc..5fde174 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -25,7 +25,7 @@ time_t read_agefile(char *path) return 0; } -static void print_modtime(struct repoinfo *repo) +static void print_modtime(struct cgit_repo *repo) { char *path; struct stat s; @@ -70,32 +70,32 @@ void cgit_print_repolist(struct cacheitem *item) html("\n"); for (i=0; igroup != NULL) || - (last_group != NULL && cgit_repo->group == NULL) || - (last_group != NULL && cgit_repo->group != NULL && - strcmp(cgit_repo->group, last_group))) { + ctx.repo = &cgit_repolist.repos[i]; + if ((last_group == NULL && ctx.repo->group != NULL) || + (last_group != NULL && ctx.repo->group == NULL) || + (last_group != NULL && ctx.repo->group != NULL && + strcmp(ctx.repo->group, last_group))) { htmlf(""); - last_group = cgit_repo->group; + last_group = ctx.repo->group; } htmlf(""); if (ctx.cfg.enable_index_links) { html("\n\n"); htmlf("
"); cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, sha1_to_hex(commit->object.sha1)); - if (cgit_repo->enable_log_filecount) { + if (ctx.repo->enable_log_filecount) { files = 0; add_lines = 0; rem_lines = 0; cgit_diff_commit(commit, inspect_files); html(""); htmlf("%d", files); - if (cgit_repo->enable_log_linecount) { + if (ctx.repo->enable_log_linecount) { html(""); htmlf("-%d/+%d", rem_lines, add_lines); } @@ -94,9 +94,9 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern html("
AgeMessageFilesLinesAuthor
", columns); - html_txt(cgit_repo->group); + html_txt(ctx.repo->group); html("
", - cgit_repo->group ? "sublevel-repo" : "toplevel-repo"); - html_link_open(cgit_repourl(cgit_repo->url), NULL, NULL); - html_txt(cgit_repo->name); + ctx.repo->group ? "sublevel-repo" : "toplevel-repo"); + html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL); + html_txt(ctx.repo->name); html_link_close(); html(""); - html_ntxt(ctx.cfg.max_repodesc_len, cgit_repo->desc); + html_ntxt(ctx.cfg.max_repodesc_len, ctx.repo->desc); html(""); - html_txt(cgit_repo->owner); + html_txt(ctx.repo->owner); html(""); - print_modtime(cgit_repo); + print_modtime(ctx.repo); html(""); - html_link_open(cgit_repourl(cgit_repo->url), + html_link_open(cgit_repourl(ctx.repo->url), NULL, "button"); html("summary"); cgit_log_link("log", NULL, "button", NULL, NULL, NULL, diff --git a/ui-shared.c b/ui-shared.c index b96237d..b9f487a 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -141,8 +141,8 @@ static char *repolink(char *title, char *class, char *page, char *head, html_attr(ctx.cfg.virtual_root); if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') html("/"); - html_attr(cgit_repo->url); - if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') + html_attr(ctx.repo->url); + if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') html("/"); if (page) { html(page); @@ -153,8 +153,8 @@ static char *repolink(char *title, char *class, char *page, char *head, } else { html(ctx.cfg.script_name); html("?url="); - html_attr(cgit_repo->url); - if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') + html_attr(ctx.repo->url); + if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') html("/"); if (page) { html(page); @@ -164,7 +164,7 @@ static char *repolink(char *title, char *class, char *page, char *head, } delim = "&"; } - if (head && strcmp(head, cgit_repo->defbranch)) { + if (head && strcmp(head, ctx.repo->defbranch)) { html(delim); html("h="); html_attr(head); @@ -446,7 +446,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page) html_hidden("url", url); } - if (incl_head && strcmp(ctx.qry.head, cgit_repo->defbranch)) + if (incl_head && strcmp(ctx.qry.head, ctx.repo->defbranch)) html_hidden("h", ctx.qry.head); if (ctx.qry.sha1) @@ -478,12 +478,12 @@ void cgit_print_pageheader(char *title, int show_search) html("
"); if (S_ISGITLINK(mode)) { htmlf(""); -- cgit From b88fb016d0209f7041ac7d3b4d2c077318407a4d Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 16 Feb 2008 21:16:53 +0100 Subject: Improve initialization of git directory Using the functions offered by libgit feels like the right thing to do. Also, make sure that config errors gets properly reported. Signed-off-by: Lars Hjemli --- cgit.c | 17 ++++++++--------- ui-shared.c | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/cgit.c b/cgit.c index b270fdc..2c933dc 100644 --- a/cgit.c +++ b/cgit.c @@ -83,20 +83,23 @@ static void cgit_print_repo_page(struct cacheitem *item) char *title, *tmp; int show_search; unsigned char sha1[20]; + int nongit = 0; - if (chdir(ctx.repo->path)) { - title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); + setenv("GIT_DIR", ctx.repo->path, 1); + setup_git_directory_gently(&nongit); + if (nongit) { + 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_docstart(title, item); cgit_print_pageheader(title, 0); - cgit_print_error(fmt("Unable to scan repository: %s", - strerror(errno))); + cgit_print_error(tmp); cgit_print_docend(); return; } title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc); show_search = 0; - setenv("GIT_DIR", ctx.repo->path, 1); if (!ctx.qry.head) { ctx.qry.head = xstrdup(find_default_branch(ctx.repo)); @@ -179,10 +182,8 @@ static void cgit_print_repo_page(struct cacheitem *item) static void cgit_fill_cache(struct cacheitem *item, int use_cache) { - static char buf[PATH_MAX]; int stdout2; - getcwd(buf, sizeof(buf)); item->st.st_mtime = time(NULL); if (use_cache) { @@ -203,8 +204,6 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache) "Restoring original STDOUT"); chk_zero(close(stdout2), "Closing temporary STDOUT"); } - - chdir(buf); } static void cgit_check_cache(struct cacheitem *item) diff --git a/ui-shared.c b/ui-shared.c index b9f487a..cc1ab8b 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -476,7 +476,7 @@ void cgit_print_pageheader(char *title, int show_search) htmlf("'>cgit\n", ctx.cfg.logo); html("
"); if (is_null_sha1(info->new_sha1)) { - html_filemode(info->old_mode); + cgit_print_filemode(info->old_mode); } else { - html_filemode(info->new_mode); + cgit_print_filemode(info->new_mode); } if (info->old_mode != info->new_mode && !is_null_sha1(info->old_sha1) && !is_null_sha1(info->new_sha1)) { html("["); - html_filemode(info->old_mode); + cgit_print_filemode(info->old_mode); html("]"); } htmlf("", class); diff --git a/ui-diff.c b/ui-diff.c index 263a7ba..5c3bc98 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -7,7 +7,7 @@ */ #include "cgit.h" - +#include "html.h" unsigned char old_rev_sha1[20]; unsigned char new_rev_sha1[20]; diff --git a/ui-log.c b/ui-log.c index 72e2a4b..e1d324d 100644 --- a/ui-log.c +++ b/ui-log.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "html.h" int files, add_lines, rem_lines; diff --git a/ui-patch.c b/ui-patch.c index 1da0a27..d93426b 100644 --- a/ui-patch.c +++ b/ui-patch.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "html.h" static void print_line(char *line, int len) { diff --git a/ui-refs.c b/ui-refs.c index ba513c1..e2a16f4 100644 --- a/ui-refs.c +++ b/ui-refs.c @@ -7,9 +7,7 @@ */ #include "cgit.h" - - - +#include "html.h" void cgit_print_refs() { diff --git a/ui-repolist.c b/ui-repolist.c index 5fde174..cd4e41d 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -6,9 +6,10 @@ * (see COPYING for full license text) */ -#include "cgit.h" #include +#include "cgit.h" +#include "html.h" time_t read_agefile(char *path) { diff --git a/ui-shared.c b/ui-shared.c index cc1ab8b..2eff79d 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "html.h" const char cgit_doctype[] = "> 6); + html_fileperm(mode >> 3); + html_fileperm(mode); +} + /* vim:set sw=8: */ diff --git a/ui-snapshot.c b/ui-snapshot.c index dfedd8f..67dbbdd 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "html.h" static int write_compressed_tar_archive(struct archiver_args *args,const char *filter) { diff --git a/ui-summary.c b/ui-summary.c index 3baac08..0afa0a3 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "html.h" static int header; diff --git a/ui-tag.c b/ui-tag.c index 6d761f3..2998d02 100644 --- a/ui-tag.c +++ b/ui-tag.c @@ -7,7 +7,7 @@ */ #include "cgit.h" - +#include "html.h" static void print_tag_content(char *buf) { diff --git a/ui-tree.c b/ui-tree.c index df05ad3..7912784 100644 --- a/ui-tree.c +++ b/ui-tree.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "html.h" char *curr_rev; char *match_path; @@ -79,7 +80,7 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, } html("
"); - html_filemode(mode); + cgit_print_filemode(mode); html(""); if (S_ISGITLINK(mode)) { htmlf("path); ctx.repo = NULL; - cgit_print_docstart(title, item); - cgit_print_pageheader(title, 0); + cgit_print_http_headers(&ctx); + cgit_print_docstart(&ctx); + cgit_print_pageheader(&ctx); cgit_print_error(tmp); cgit_print_docend(); return; } - title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc); + ctx.page.title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc); show_search = 0; if (!ctx.qry.head) { @@ -107,8 +112,9 @@ static void cgit_print_repo_page(struct cacheitem *item) } if (!ctx.qry.head) { - cgit_print_docstart(title, item); - cgit_print_pageheader(title, 0); + 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; @@ -117,8 +123,9 @@ static void cgit_print_repo_page(struct cacheitem *item) if (get_sha1(ctx.qry.head, sha1)) { tmp = xstrdup(ctx.qry.head); ctx.qry.head = ctx.repo->defbranch; - cgit_print_docstart(title, item); - cgit_print_pageheader(title, 0); + 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; @@ -143,15 +150,16 @@ static void cgit_print_repo_page(struct cacheitem *item) } show_search = (cgit_cmd == CMD_LOG); - cgit_print_docstart(title, item); + cgit_print_http_headers(&ctx); + cgit_print_docstart(&ctx); if (!cgit_cmd) { - cgit_print_pageheader("summary", show_search); + cgit_print_pageheader(&ctx); cgit_print_summary(); cgit_print_docend(); return; } - cgit_print_pageheader(ctx.qry.page, show_search); + cgit_print_pageheader(&ctx); switch(cgit_cmd) { case CMD_LOG: @@ -180,12 +188,18 @@ static void cgit_print_repo_page(struct cacheitem *item) cgit_print_docend(); } +static long ttl_seconds(long ttl) +{ + if (ttl<0) + return 60 * 60 * 24 * 365; + else + return ttl * 60; +} + static void cgit_fill_cache(struct cacheitem *item, int use_cache) { int stdout2; - item->st.st_mtime = time(NULL); - if (use_cache) { stdout2 = chk_positive(dup(STDOUT_FILENO), "Preserving STDOUT"); @@ -193,6 +207,8 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache) chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)"); } + ctx.page.modified = time(NULL); + ctx.page.expires = ctx.page.modified + ttl_seconds(item->ttl); if (ctx.repo) cgit_print_repo_page(item); else diff --git a/cgit.h b/cgit.h index 5b7ee1c..8ab8e07 100644 --- a/cgit.h +++ b/cgit.h @@ -174,10 +174,20 @@ struct cgit_config { int summary_tags; }; +struct cgit_page { + time_t modified; + time_t expires; + char *mimetype; + char *charset; + char *filename; + char *title; +}; + struct cgit_context { struct cgit_query qry; struct cgit_config cfg; struct cgit_repo *repo; + struct cgit_page page; }; extern const char *cgit_version; @@ -260,12 +270,10 @@ extern void cgit_object_link(struct object *obj); extern void cgit_print_error(char *msg); extern void cgit_print_date(time_t secs, char *format); extern void cgit_print_age(time_t t, time_t max_relative, char *format); -extern void cgit_print_docstart(char *title, struct cacheitem *item); +extern void cgit_print_http_headers(struct cgit_context *ctx); +extern void cgit_print_docstart(struct cgit_context *ctx); extern void cgit_print_docend(); -extern void cgit_print_pageheader(char *title, int show_search); -extern void cgit_print_snapshot_start(const char *mimetype, - const char *filename, - struct cacheitem *item); +extern void cgit_print_pageheader(struct cgit_context *ctx); extern void cgit_print_filemode(unsigned short mode); extern void cgit_print_branches(int maxcount); extern void cgit_print_tags(int maxcount); diff --git a/shared.c b/shared.c index 76e10d0..539d533 100644 --- a/shared.c +++ b/shared.c @@ -35,6 +35,9 @@ void cgit_prepare_context(struct cgit_context *ctx) ctx->cfg.robots = "index, nofollow"; ctx->cfg.root_title = "Git repository browser"; ctx->cfg.script_name = CGIT_SCRIPT_NAME; + ctx->page.mimetype = "text/html"; + ctx->page.charset = PAGE_ENCODING; + ctx->page.filename = NULL; } int cgit_get_cmd_index(const char *cmd) diff --git a/ui-blob.c b/ui-blob.c index be4fb88..bd44574 100644 --- a/ui-blob.c +++ b/ui-blob.c @@ -35,6 +35,8 @@ void cgit_print_blob(struct cacheitem *item, const char *hex, char *path) } buf[size] = '\0'; - cgit_print_snapshot_start("text/plain", path, item); + ctx.page.mimetype = "text/plain"; + ctx.page.filename = path; + cgit_print_http_headers(&ctx); write(htmlfd, buf, size); } diff --git a/ui-patch.c b/ui-patch.c index d93426b..a77f3f6 100644 --- a/ui-patch.c +++ b/ui-patch.c @@ -92,7 +92,9 @@ void cgit_print_patch(char *hex, struct cacheitem *item) hashcpy(old_sha1, commit->parents->item->object.sha1); patchname = fmt("%s.patch", sha1_to_hex(sha1)); - cgit_print_snapshot_start("text/plain", patchname, item); + ctx.page.mimetype = "text/plain"; + ctx.page.filename = patchname; + cgit_print_http_headers(&ctx); htmlf("From %s Mon Sep 17 00:00:00 2001\n", sha1_to_hex(sha1)); htmlf("From: %s%s\n", info->author, info->author_email); html("Date: "); diff --git a/ui-repolist.c b/ui-repolist.c index cd4e41d..e663585 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -51,8 +51,10 @@ void cgit_print_repolist(struct cacheitem *item) if (ctx.cfg.enable_index_links) columns++; - cgit_print_docstart(ctx.cfg.root_title, item); - cgit_print_pageheader(ctx.cfg.root_title, 0); + ctx.page.title = ctx.cfg.root_title; + cgit_print_http_headers(&ctx); + cgit_print_docstart(&ctx); + cgit_print_pageheader(&ctx); html(""); if (ctx.cfg.index_header) { diff --git a/ui-shared.c b/ui-shared.c index 2eff79d..2596023 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -26,14 +26,6 @@ static char *http_date(time_t t) tm->tm_hour, tm->tm_min, tm->tm_sec); } -static long ttl_seconds(long ttl) -{ - if (ttl<0) - return 60 * 60 * 24 * 365; - else - return ttl * 60; -} - void cgit_print_error(char *msg) { html("
"); @@ -361,24 +353,34 @@ void cgit_print_age(time_t t, time_t max_relative, char *format) secs * 1.0 / TM_YEAR); } -void cgit_print_docstart(char *title, struct cacheitem *item) +void cgit_print_http_headers(struct cgit_context *ctx) { - html("Content-Type: text/html; charset=" PAGE_ENCODING "\n"); - htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); - htmlf("Expires: %s\n", http_date(item->st.st_mtime + - ttl_seconds(item->ttl))); + if (ctx->page.mimetype && ctx->page.charset) + htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, + ctx->page.charset); + else if (ctx->page.mimetype) + htmlf("Content-Type: %s\n", ctx->page.mimetype); + if (ctx->page.filename) + htmlf("Content-Disposition: inline; filename=\"%s\"\n", + ctx->page.filename); + htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); + htmlf("Expires: %s\n", http_date(ctx->page.expires)); html("\n"); +} + +void cgit_print_docstart(struct cgit_context *ctx) +{ html(cgit_doctype); html("\n"); html("\n"); html(""); - html_txt(title); + html_txt(ctx->page.title); html("\n"); htmlf("\n", cgit_version); - if (ctx.cfg.robots && *ctx.cfg.robots) - htmlf("\n", ctx.cfg.robots); + if (ctx->cfg.robots && *ctx->cfg.robots) + htmlf("\n", ctx->cfg.robots); html("\n"); html("\n"); html("\n"); @@ -463,7 +465,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page) } } -void cgit_print_pageheader(char *title, int show_search) +void cgit_print_pageheader(struct cgit_context *ctx) { static const char *default_info = "This is cgit, a fast webinterface for git repositories"; int header = 0; @@ -475,40 +477,40 @@ void cgit_print_pageheader(char *title, int show_search) html("
\n