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 <hjemli@gmail.com> --- ui-shared.c | 86 ++++++++++++++++++++++++++++++------------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) (limited to 'ui-shared.c') 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("<h1>download</h1>\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("'><img src='%s' alt='cgit'/></a>\n", cgit_logo); html("</td></tr>\n<tr><td class='sidebar'>\n"); - if (cgit_query_repo) { + if (ctx.qry.repo) { html("<h1 class='first'>"); html_txt(strrpart(cgit_repo->name, 20)); html("</h1>\n"); @@ -486,18 +486,18 @@ void cgit_print_pageheader(char *title, int show_search) html_txt(cgit_repo->owner); } html("<h1>navigate</h1>\n"); - reporevlink(NULL, "summary", NULL, "menu", cgit_query_head, + reporevlink(NULL, "summary", NULL, "menu", ctx.qry.head, NULL, NULL); - cgit_log_link("log", NULL, "menu", cgit_query_head, NULL, NULL, + cgit_log_link("log", NULL, "menu", ctx.qry.head, NULL, NULL, 0, NULL, NULL); - cgit_tree_link("tree", NULL, "menu", cgit_query_head, - cgit_query_sha1, NULL); - cgit_commit_link("commit", NULL, "menu", cgit_query_head, - cgit_query_sha1); - cgit_diff_link("diff", NULL, "menu", cgit_query_head, - cgit_query_sha1, cgit_query_sha2, NULL); - cgit_patch_link("patch", NULL, "menu", cgit_query_head, - cgit_query_sha1); + cgit_tree_link("tree", NULL, "menu", ctx.qry.head, + ctx.qry.sha1, NULL); + cgit_commit_link("commit", NULL, "menu", ctx.qry.head, + ctx.qry.sha1); + cgit_diff_link("diff", NULL, "menu", ctx.qry.head, + ctx.qry.sha1, ctx.qry.sha2, NULL); + cgit_patch_link("patch", NULL, "menu", ctx.qry.head, + ctx.qry.sha1); for_each_ref(print_archive_ref, &header); @@ -519,10 +519,10 @@ void cgit_print_pageheader(char *title, int show_search) html("<h1>branch</h1>\n"); html("<form method='get' action=''>\n"); - add_hidden_formfields(0, 1, cgit_query_page); + add_hidden_formfields(0, 1, ctx.qry.page); // html("<table summary='branch selector' class='grid'><tr><td id='branch-dropdown-cell'>"); html("<select name='h' onchange='this.form.submit();'>\n"); - for_each_branch_ref(print_branch_option, cgit_query_head); + for_each_branch_ref(print_branch_option, ctx.qry.head); html("</select>\n"); // html("</td><td>"); html("<noscript><input type='submit' id='switch-btn' value='switch'/></noscript>\n"); @@ -532,17 +532,17 @@ void cgit_print_pageheader(char *title, int show_search) html("<h1>search</h1>\n"); html("<form method='get' action='"); if (cgit_virtual_root) - html_attr(cgit_fileurl(cgit_query_repo, "log", - cgit_query_path, NULL)); + html_attr(cgit_fileurl(ctx.qry.repo, "log", + ctx.qry.path, NULL)); html("'>\n"); add_hidden_formfields(1, 0, "log"); html("<select name='qt'>\n"); - html_option("grep", "log msg", cgit_query_grep); - html_option("author", "author", cgit_query_grep); - html_option("committer", "committer", cgit_query_grep); + html_option("grep", "log msg", ctx.qry.grep); + html_option("author", "author", ctx.qry.grep); + html_option("committer", "committer", ctx.qry.grep); html("</select>\n"); html("<input class='txt' type='text' name='q' value='"); - html_attr(cgit_query_search); + html_attr(ctx.qry.search); html("'/>\n"); html("</form>\n"); } else { -- cgit v1.2.3-54-g00ecf From b228d4ff82a65fdcd4a7364759fe36a0bdda5978 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 16 Feb 2008 13:07:13 +0100 Subject: Add all config variables into struct cgit_context This removes another big set of global variables, and introduces the cgit_prepare_context() function which populates a context-variable with compile-time default values. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cache.c | 10 ++--- cgit.c | 33 +++++++------- cgit.h | 72 +++++++++++++++--------------- shared.c | 138 +++++++++++++++++++++++++++------------------------------- ui-repolist.c | 18 ++++---- ui-shared.c | 60 ++++++++++++------------- ui-summary.c | 10 ++--- 7 files changed, 166 insertions(+), 175 deletions(-) (limited to 'ui-shared.c') diff --git a/cache.c b/cache.c index b162952..2ed0d6f 100644 --- a/cache.c +++ b/cache.c @@ -44,21 +44,21 @@ int cache_create_dirs() { char *path; - path = fmt("%s", cgit_cache_root); + path = fmt("%s", ctx.cfg.cache_root); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; if (!cgit_repo) return 0; - path = fmt("%s/%s", cgit_cache_root, + path = fmt("%s/%s", ctx.cfg.cache_root, cache_safe_filename(cgit_repo->url)); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; if (ctx.qry.page) { - path = fmt("%s/%s/%s", cgit_cache_root, + path = fmt("%s/%s/%s", ctx.cfg.cache_root, cache_safe_filename(cgit_repo->url), ctx.qry.page); if (mkdir(path, S_IRWXU) && errno!=EEXIST) @@ -74,7 +74,7 @@ int cache_refill_overdue(const char *lockfile) if (stat(lockfile, &st)) return 0; else - return (time(NULL) - st.st_mtime > cgit_cache_max_create_time); + return (time(NULL) - st.st_mtime > ctx.cfg.cache_max_create_time); } int cache_lock(struct cacheitem *item) @@ -83,7 +83,7 @@ int cache_lock(struct cacheitem *item) char *lockfile = xstrdup(fmt("%s.lock", item->name)); top: - if (++i > cgit_max_lock_attempts) + if (++i > ctx.cfg.max_lock_attempts) die("cache_lock: unable to lock %s: %s", item->name, strerror(errno)); diff --git a/cgit.c b/cgit.c index 8a30c3c..f0907a1 100644 --- a/cgit.c +++ b/cgit.c @@ -11,7 +11,7 @@ static int cgit_prepare_cache(struct cacheitem *item) { if (!cgit_repo && ctx.qry.repo) { - char *title = fmt("%s - %s", cgit_root_title, "Bad request"); + char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo)); @@ -20,27 +20,27 @@ static int cgit_prepare_cache(struct cacheitem *item) } if (!cgit_repo) { - item->name = xstrdup(fmt("%s/index.html", cgit_cache_root)); - item->ttl = cgit_cache_root_ttl; + 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", cgit_cache_root, + item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root, cache_safe_filename(cgit_repo->url), cache_safe_filename(ctx.qry.raw))); - item->ttl = cgit_cache_repo_ttl; + item->ttl = ctx.cfg.cache_repo_ttl; } else { - item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root, + item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root, cache_safe_filename(cgit_repo->url), ctx.qry.page, cache_safe_filename(ctx.qry.raw))); if (ctx.qry.has_symref) - item->ttl = cgit_cache_dynamic_ttl; + item->ttl = ctx.cfg.cache_dynamic_ttl; else if (ctx.qry.has_sha1) - item->ttl = cgit_cache_static_ttl; + item->ttl = ctx.cfg.cache_static_ttl; else - item->ttl = cgit_cache_repo_ttl; + item->ttl = ctx.cfg.cache_repo_ttl; } return 1; } @@ -85,7 +85,7 @@ static void cgit_print_repo_page(struct cacheitem *item) unsigned char sha1[20]; if (chdir(cgit_repo->path)) { - title = fmt("%s - %s", cgit_root_title, "Bad request"); + title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); cgit_print_error(fmt("Unable to scan repository: %s", @@ -153,7 +153,7 @@ static void cgit_print_repo_page(struct cacheitem *item) switch(cgit_cmd) { case CMD_LOG: cgit_print_log(ctx.qry.sha1, ctx.qry.ofs, - cgit_max_commit_count, ctx.qry.grep, ctx.qry.search, + ctx.cfg.max_commit_count, ctx.qry.grep, ctx.qry.search, ctx.qry.path, 1); break; case CMD_TREE: @@ -212,7 +212,7 @@ static void cgit_check_cache(struct cacheitem *item) int i = 0; top: - if (++i > cgit_max_lock_attempts) { + if (++i > ctx.cfg.max_lock_attempts) { die("cgit_refresh_cache: unable to lock %s: %s", item->name, strerror(errno)); } @@ -258,10 +258,10 @@ static void cgit_parse_args(int argc, const char **argv) for (i = 1; i < argc; i++) { if (!strncmp(argv[i], "--cache=", 8)) { - cgit_cache_root = xstrdup(argv[i]+8); + ctx.cfg.cache_root = xstrdup(argv[i]+8); } if (!strcmp(argv[i], "--nocache")) { - cgit_nocache = 1; + ctx.cfg.nocache = 1; } if (!strncmp(argv[i], "--query=", 8)) { ctx.qry.raw = xstrdup(argv[i]+8); @@ -291,6 +291,7 @@ int main(int argc, const char **argv) struct cacheitem item; const char *cgit_config_env = getenv("CGIT_CONFIG"); + cgit_prepare_context(&ctx); htmlfd = STDOUT_FILENO; item.st.st_mtime = time(NULL); cgit_repolist.length = 0; @@ -301,14 +302,14 @@ int main(int argc, const char **argv) cgit_global_config_cb); cgit_repo = NULL; if (getenv("SCRIPT_NAME")) - cgit_script_name = xstrdup(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); cgit_parse_query(ctx.qry.raw, cgit_querystring_cb); if (!cgit_prepare_cache(&item)) return 0; - if (cgit_nocache) { + if (ctx.cfg.nocache) { cgit_fill_cache(&item, 0); } else { cgit_check_cache(&item); diff --git a/cgit.h b/cgit.h index 4576efb..0338ebd 100644 --- a/cgit.h +++ b/cgit.h @@ -139,8 +139,44 @@ struct cgit_query { int ofs; }; +struct cgit_config { + char *agefile; + char *cache_root; + char *clone_prefix; + char *css; + char *index_header; + char *index_info; + char *logo; + char *logo_link; + char *module_link; + char *repo_group; + char *robots; + char *root_title; + char *script_name; + char *virtual_root; + int cache_dynamic_ttl; + int cache_max_create_time; + int cache_repo_ttl; + int cache_root_ttl; + int cache_static_ttl; + int enable_index_links; + int enable_log_filecount; + int enable_log_linecount; + int max_commit_count; + int max_lock_attempts; + int max_msg_len; + int max_repodesc_len; + int nocache; + int renamelimit; + int snapshots; + int summary_branches; + int summary_log; + int summary_tags; +}; + struct cgit_context { struct cgit_query qry; + struct cgit_config cfg; }; extern const char *cgit_version; @@ -150,43 +186,9 @@ extern struct repoinfo *cgit_repo; extern struct cgit_context ctx; extern int cgit_cmd; -extern char *cgit_root_title; -extern char *cgit_css; -extern char *cgit_logo; -extern char *cgit_index_header; -extern char *cgit_index_info; -extern char *cgit_logo_link; -extern char *cgit_module_link; -extern char *cgit_agefile; -extern char *cgit_virtual_root; -extern char *cgit_script_name; -extern char *cgit_cache_root; -extern char *cgit_repo_group; -extern char *cgit_robots; -extern char *cgit_clone_prefix; - -extern int cgit_nocache; -extern int cgit_snapshots; -extern int cgit_enable_index_links; -extern int cgit_enable_log_filecount; -extern int cgit_enable_log_linecount; -extern int cgit_max_lock_attempts; -extern int cgit_cache_root_ttl; -extern int cgit_cache_repo_ttl; -extern int cgit_cache_dynamic_ttl; -extern int cgit_cache_static_ttl; -extern int cgit_cache_max_create_time; -extern int cgit_summary_log; -extern int cgit_summary_tags; -extern int cgit_summary_branches; - -extern int cgit_max_msg_len; -extern int cgit_max_repodesc_len; -extern int cgit_max_commit_count; - - extern int htmlfd; +extern void cgit_prepare_context(struct cgit_context *ctx); extern int cgit_get_cmd_index(const char *cmd); extern struct repoinfo *cgit_get_repoinfo(const char *url); extern void cgit_global_config_cb(const char *name, const char *value); diff --git a/shared.c b/shared.c index 6c1a762..8dd2b00 100644 --- a/shared.c +++ b/shared.c @@ -15,43 +15,31 @@ int cgit_cmd; const char *cgit_version = CGIT_VERSION; -char *cgit_root_title = "Git repository browser"; -char *cgit_css = "/cgit.css"; -char *cgit_logo = "/git-logo.png"; -char *cgit_index_header = NULL; -char *cgit_index_info = NULL; -char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/"; -char *cgit_module_link = "./?repo=%s&page=commit&id=%s"; -char *cgit_agefile = "info/web/last-modified"; -char *cgit_virtual_root = NULL; -char *cgit_script_name = CGIT_SCRIPT_NAME; -char *cgit_cache_root = CGIT_CACHE_ROOT; -char *cgit_repo_group = NULL; -char *cgit_robots = "index, nofollow"; -char *cgit_clone_prefix = NULL; - -int cgit_nocache = 0; -int cgit_snapshots = 0; -int cgit_enable_index_links = 0; -int cgit_enable_log_filecount = 0; -int cgit_enable_log_linecount = 0; -int cgit_max_lock_attempts = 5; -int cgit_cache_root_ttl = 5; -int cgit_cache_repo_ttl = 5; -int cgit_cache_dynamic_ttl = 5; -int cgit_cache_static_ttl = -1; -int cgit_cache_max_create_time = 5; -int cgit_summary_log = 0; -int cgit_summary_tags = 0; -int cgit_summary_branches = 0; -int cgit_renamelimit = -1; - -int cgit_max_msg_len = 60; -int cgit_max_repodesc_len = 60; -int cgit_max_commit_count = 50; - int htmlfd = 0; +void cgit_prepare_context(struct cgit_context *ctx) +{ + memset(ctx, 0, sizeof(ctx)); + ctx->cfg.agefile = "info/web/last-modified"; + ctx->cfg.cache_dynamic_ttl = 5; + ctx->cfg.cache_max_create_time = 5; + ctx->cfg.cache_repo_ttl = 5; + ctx->cfg.cache_root = CGIT_CACHE_ROOT; + ctx->cfg.cache_root_ttl = 5; + ctx->cfg.cache_static_ttl = -1; + ctx->cfg.css = "/cgit.css"; + ctx->cfg.logo = "/git-logo.png"; + ctx->cfg.max_commit_count = 50; + ctx->cfg.max_lock_attempts = 5; + ctx->cfg.max_msg_len = 60; + ctx->cfg.max_repodesc_len = 60; + ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; + ctx->cfg.renamelimit = -1; + 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", @@ -105,12 +93,12 @@ struct repoinfo *add_repo(const char *url) ret->path = NULL; ret->desc = "[no description]"; ret->owner = NULL; - ret->group = cgit_repo_group; + ret->group = ctx.cfg.repo_group; ret->defbranch = "master"; - ret->snapshots = cgit_snapshots; - ret->enable_log_filecount = cgit_enable_log_filecount; - ret->enable_log_linecount = cgit_enable_log_linecount; - ret->module_link = cgit_module_link; + ret->snapshots = ctx.cfg.snapshots; + ret->enable_log_filecount = ctx.cfg.enable_log_filecount; + ret->enable_log_linecount = ctx.cfg.enable_log_linecount; + ret->module_link = ctx.cfg.module_link; ret->readme = NULL; return ret; } @@ -131,65 +119,65 @@ struct repoinfo *cgit_get_repoinfo(const char *url) void cgit_global_config_cb(const char *name, const char *value) { if (!strcmp(name, "root-title")) - cgit_root_title = xstrdup(value); + ctx.cfg.root_title = xstrdup(value); else if (!strcmp(name, "css")) - cgit_css = xstrdup(value); + ctx.cfg.css = xstrdup(value); else if (!strcmp(name, "logo")) - cgit_logo = xstrdup(value); + ctx.cfg.logo = xstrdup(value); else if (!strcmp(name, "index-header")) - cgit_index_header = xstrdup(value); + ctx.cfg.index_header = xstrdup(value); else if (!strcmp(name, "index-info")) - cgit_index_info = xstrdup(value); + ctx.cfg.index_info = xstrdup(value); else if (!strcmp(name, "logo-link")) - cgit_logo_link = xstrdup(value); + ctx.cfg.logo_link = xstrdup(value); else if (!strcmp(name, "module-link")) - cgit_module_link = xstrdup(value); + ctx.cfg.module_link = xstrdup(value); else if (!strcmp(name, "virtual-root")) { - cgit_virtual_root = trim_end(value, '/'); - if (!cgit_virtual_root && (!strcmp(value, "/"))) - cgit_virtual_root = ""; + ctx.cfg.virtual_root = trim_end(value, '/'); + if (!ctx.cfg.virtual_root && (!strcmp(value, "/"))) + ctx.cfg.virtual_root = ""; } else if (!strcmp(name, "nocache")) - cgit_nocache = atoi(value); + ctx.cfg.nocache = atoi(value); else if (!strcmp(name, "snapshots")) - cgit_snapshots = cgit_parse_snapshots_mask(value); + ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); else if (!strcmp(name, "enable-index-links")) - cgit_enable_index_links = atoi(value); + ctx.cfg.enable_index_links = atoi(value); else if (!strcmp(name, "enable-log-filecount")) - cgit_enable_log_filecount = atoi(value); + ctx.cfg.enable_log_filecount = atoi(value); else if (!strcmp(name, "enable-log-linecount")) - cgit_enable_log_linecount = atoi(value); + ctx.cfg.enable_log_linecount = atoi(value); else if (!strcmp(name, "cache-root")) - cgit_cache_root = xstrdup(value); + ctx.cfg.cache_root = xstrdup(value); else if (!strcmp(name, "cache-root-ttl")) - cgit_cache_root_ttl = atoi(value); + ctx.cfg.cache_root_ttl = atoi(value); else if (!strcmp(name, "cache-repo-ttl")) - cgit_cache_repo_ttl = atoi(value); + ctx.cfg.cache_repo_ttl = atoi(value); else if (!strcmp(name, "cache-static-ttl")) - cgit_cache_static_ttl = atoi(value); + ctx.cfg.cache_static_ttl = atoi(value); else if (!strcmp(name, "cache-dynamic-ttl")) - cgit_cache_dynamic_ttl = atoi(value); + ctx.cfg.cache_dynamic_ttl = atoi(value); else if (!strcmp(name, "max-message-length")) - cgit_max_msg_len = atoi(value); + ctx.cfg.max_msg_len = atoi(value); else if (!strcmp(name, "max-repodesc-length")) - cgit_max_repodesc_len = atoi(value); + ctx.cfg.max_repodesc_len = atoi(value); else if (!strcmp(name, "max-commit-count")) - cgit_max_commit_count = atoi(value); + ctx.cfg.max_commit_count = atoi(value); else if (!strcmp(name, "summary-log")) - cgit_summary_log = atoi(value); + ctx.cfg.summary_log = atoi(value); else if (!strcmp(name, "summary-branches")) - cgit_summary_branches = atoi(value); + ctx.cfg.summary_branches = atoi(value); else if (!strcmp(name, "summary-tags")) - cgit_summary_tags = atoi(value); + ctx.cfg.summary_tags = atoi(value); else if (!strcmp(name, "agefile")) - cgit_agefile = xstrdup(value); + ctx.cfg.agefile = xstrdup(value); else if (!strcmp(name, "renamelimit")) - cgit_renamelimit = atoi(value); + ctx.cfg.renamelimit = atoi(value); else if (!strcmp(name, "robots")) - cgit_robots = xstrdup(value); + ctx.cfg.robots = xstrdup(value); else if (!strcmp(name, "clone-prefix")) - cgit_clone_prefix = xstrdup(value); + ctx.cfg.clone_prefix = xstrdup(value); else if (!strcmp(name, "repo.group")) - cgit_repo_group = xstrdup(value); + ctx.cfg.repo_group = xstrdup(value); else if (!strcmp(name, "repo.url")) cgit_repo = add_repo(value); else if (!strcmp(name, "repo.name")) @@ -205,11 +193,11 @@ void cgit_global_config_cb(const char *name, const char *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 = cgit_snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */ + 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 = cgit_enable_log_filecount * atoi(value); + 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 = cgit_enable_log_linecount * atoi(value); + 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) { @@ -476,7 +464,7 @@ void cgit_diff_tree(const unsigned char *old_sha1, diff_setup(&opt); opt.output_format = DIFF_FORMAT_CALLBACK; opt.detect_rename = 1; - opt.rename_limit = cgit_renamelimit; + opt.rename_limit = ctx.cfg.renamelimit; DIFF_OPT_SET(&opt, RECURSIVE); opt.format_callback = cgit_diff_tree_cb; opt.format_callback_data = fn; diff --git a/ui-repolist.c b/ui-repolist.c index 3e97ca9..a6cc2cc 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -30,7 +30,7 @@ static void print_modtime(struct repoinfo *repo) char *path; struct stat s; - path = fmt("%s/%s", repo->path, cgit_agefile); + path = fmt("%s/%s", repo->path, ctx.cfg.agefile); if (stat(path, &s) == 0) { cgit_print_age(read_agefile(path), -1, NULL); return; @@ -47,17 +47,17 @@ void cgit_print_repolist(struct cacheitem *item) int i, columns = 4; char *last_group = NULL; - if (cgit_enable_index_links) + if (ctx.cfg.enable_index_links) columns++; - cgit_print_docstart(cgit_root_title, item); - cgit_print_pageheader(cgit_root_title, 0); + cgit_print_docstart(ctx.cfg.root_title, item); + cgit_print_pageheader(ctx.cfg.root_title, 0); html("<table summary='repository list' class='list nowrap'>"); - if (cgit_index_header) { + if (ctx.cfg.index_header) { htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>", columns); - html_include(cgit_index_header); + html_include(ctx.cfg.index_header); html("</td></tr>"); } html("<tr class='nohover'>" @@ -65,7 +65,7 @@ void cgit_print_repolist(struct cacheitem *item) "<th class='left'>Description</th>" "<th class='left'>Owner</th>" "<th class='left'>Idle</th>"); - if (cgit_enable_index_links) + if (ctx.cfg.enable_index_links) html("<th>Links</th>"); html("</tr>\n"); @@ -87,13 +87,13 @@ void cgit_print_repolist(struct cacheitem *item) html_txt(cgit_repo->name); html_link_close(); html("</td><td>"); - html_ntxt(cgit_max_repodesc_len, cgit_repo->desc); + html_ntxt(ctx.cfg.max_repodesc_len, cgit_repo->desc); html("</td><td>"); html_txt(cgit_repo->owner); html("</td><td>"); print_modtime(cgit_repo); html("</td>"); - if (cgit_enable_index_links) { + if (ctx.cfg.enable_index_links) { html("<td>"); html_link_open(cgit_repourl(cgit_repo->url), NULL, "button"); diff --git a/ui-shared.c b/ui-shared.c index 6a41fb0..b96237d 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -42,16 +42,16 @@ void cgit_print_error(char *msg) char *cgit_rooturl() { - if (cgit_virtual_root) - return fmt("%s/", cgit_virtual_root); + if (ctx.cfg.virtual_root) + return fmt("%s/", ctx.cfg.virtual_root); else - return cgit_script_name; + return ctx.cfg.script_name; } char *cgit_repourl(const char *reponame) { - if (cgit_virtual_root) { - return fmt("%s/%s/", cgit_virtual_root, reponame); + if (ctx.cfg.virtual_root) { + return fmt("%s/%s/", ctx.cfg.virtual_root, reponame); } else { return fmt("?r=%s", reponame); } @@ -63,8 +63,8 @@ char *cgit_fileurl(const char *reponame, const char *pagename, char *tmp; char *delim; - if (cgit_virtual_root) { - tmp = fmt("%s/%s/%s/%s", cgit_virtual_root, reponame, + if (ctx.cfg.virtual_root) { + tmp = fmt("%s/%s/%s/%s", ctx.cfg.virtual_root, reponame, pagename, (filename ? filename:"")); delim = "?"; } else { @@ -110,14 +110,14 @@ const char *cgit_repobasename(const char *reponame) char *cgit_currurl() { - if (!cgit_virtual_root) - return cgit_script_name; + if (!ctx.cfg.virtual_root) + return ctx.cfg.script_name; else if (ctx.qry.page) - return fmt("%s/%s/%s/", cgit_virtual_root, ctx.qry.repo, ctx.qry.page); + return fmt("%s/%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo, ctx.qry.page); else if (ctx.qry.repo) - return fmt("%s/%s/", cgit_virtual_root, ctx.qry.repo); + return fmt("%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo); else - return fmt("%s/", cgit_virtual_root); + return fmt("%s/", ctx.cfg.virtual_root); } static char *repolink(char *title, char *class, char *page, char *head, @@ -137,9 +137,9 @@ static char *repolink(char *title, char *class, char *page, char *head, html("'"); } html(" href='"); - if (cgit_virtual_root) { - html_attr(cgit_virtual_root); - if (cgit_virtual_root[strlen(cgit_virtual_root) - 1] != '/') + if (ctx.cfg.virtual_root) { + 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] != '/') @@ -151,7 +151,7 @@ static char *repolink(char *title, char *class, char *page, char *head, html_attr(path); } } else { - html(cgit_script_name); + html(ctx.cfg.script_name); html("?url="); html_attr(cgit_repo->url); if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') @@ -229,11 +229,11 @@ void cgit_log_link(char *name, char *title, char *class, char *head, void cgit_commit_link(char *name, char *title, char *class, char *head, char *rev) { - if (strlen(name) > cgit_max_msg_len && cgit_max_msg_len >= 15) { - name[cgit_max_msg_len] = '\0'; - name[cgit_max_msg_len - 1] = '.'; - name[cgit_max_msg_len - 2] = '.'; - name[cgit_max_msg_len - 3] = '.'; + if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) { + name[ctx.cfg.max_msg_len] = '\0'; + name[ctx.cfg.max_msg_len - 1] = '.'; + name[ctx.cfg.max_msg_len - 2] = '.'; + name[ctx.cfg.max_msg_len - 3] = '.'; } reporevlink("commit", name, title, class, head, rev, NULL); } @@ -374,10 +374,10 @@ void cgit_print_docstart(char *title, struct cacheitem *item) html_txt(title); html("</title>\n"); htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); - if (cgit_robots && *cgit_robots) - htmlf("<meta name='robots' content='%s'/>\n", cgit_robots); + if (ctx.cfg.robots && *ctx.cfg.robots) + htmlf("<meta name='robots' content='%s'/>\n", ctx.cfg.robots); html("<link rel='stylesheet' type='text/css' href='"); - html_attr(cgit_css); + html_attr(ctx.cfg.css); html("'/>\n"); html("</head>\n"); html("<body>\n"); @@ -439,7 +439,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page) { char *url; - if (!cgit_virtual_root) { + if (!ctx.cfg.virtual_root) { url = fmt("%s/%s", ctx.qry.repo, page); if (ctx.qry.path) url = fmt("%s/%s", url, ctx.qry.path); @@ -474,7 +474,7 @@ void cgit_print_pageheader(char *title, int show_search) html("<tr><td class='sidebar'>\n<a href='"); html_attr(cgit_rooturl()); htmlf("'><img src='%s' alt='cgit'/></a>\n", - cgit_logo); + ctx.cfg.logo); html("</td></tr>\n<tr><td class='sidebar'>\n"); if (ctx.qry.repo) { html("<h1 class='first'>"); @@ -501,12 +501,12 @@ void cgit_print_pageheader(char *title, int show_search) for_each_ref(print_archive_ref, &header); - if (cgit_repo->clone_url || cgit_clone_prefix) { + if (cgit_repo->clone_url || ctx.cfg.clone_prefix) { html("<h1>clone</h1>\n"); if (cgit_repo->clone_url) url = cgit_repo->clone_url; else - url = fmt("%s%s", cgit_clone_prefix, + url = fmt("%s%s", ctx.cfg.clone_prefix, cgit_repo->url); html("<a class='menu' href='"); html_attr(url); @@ -531,7 +531,7 @@ void cgit_print_pageheader(char *title, int show_search) html("<h1>search</h1>\n"); html("<form method='get' action='"); - if (cgit_virtual_root) + if (ctx.cfg.virtual_root) html_attr(cgit_fileurl(ctx.qry.repo, "log", ctx.qry.path, NULL)); html("'>\n"); @@ -546,7 +546,7 @@ void cgit_print_pageheader(char *title, int show_search) html("'/>\n"); html("</form>\n"); } else { - if (!cgit_index_info || html_include(cgit_index_info)) + if (!ctx.cfg.index_info || html_include(ctx.cfg.index_info)) html(default_info); } diff --git a/ui-summary.c b/ui-summary.c index bbd4464..0a44994 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -187,14 +187,14 @@ void cgit_print_summary() html_include(cgit_repo->readme); html("</div>"); } - if (cgit_summary_log > 0) - cgit_print_log(ctx.qry.head, 0, cgit_summary_log, NULL, + if (ctx.cfg.summary_log > 0) + cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL, NULL, NULL, 0); html("<table summary='repository info' class='list nowrap'>"); - if (cgit_summary_log > 0) + if (ctx.cfg.summary_log > 0) html("<tr class='nohover'><td colspan='4'> </td></tr>"); - cgit_print_branches(cgit_summary_branches); + cgit_print_branches(ctx.cfg.summary_branches); html("<tr class='nohover'><td colspan='4'> </td></tr>"); - cgit_print_tags(cgit_summary_tags); + cgit_print_tags(ctx.cfg.summary_tags); html("</table>"); } -- cgit v1.2.3-54-g00ecf From d1f3bbe9d22029f45a77bb938c176ccc0c827d46 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 16 Feb 2008 13:56:09 +0100 Subject: Move cgit_repo into cgit_context This removes the global variable which is used to keep track of the currently selected repository, and adds a new variable in the cgit_context structure. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cache.c | 6 +++--- cgit.c | 31 +++++++++++++++--------------- cgit.h | 12 ++++++------ parsing.c | 16 ++++++++-------- shared.c | 61 +++++++++++++++++++++++++++++------------------------------ ui-commit.c | 4 ++-- ui-log.c | 10 +++++----- ui-repolist.c | 30 ++++++++++++++--------------- ui-shared.c | 28 +++++++++++++-------------- ui-summary.c | 4 ++-- ui-tree.c | 2 +- 11 files changed, 101 insertions(+), 103 deletions(-) (limited to 'ui-shared.c') diff --git a/cache.c b/cache.c index 2ed0d6f..7860fc7 100644 --- a/cache.c +++ b/cache.c @@ -48,18 +48,18 @@ int cache_create_dirs() if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; - if (!cgit_repo) + if (!ctx.repo) return 0; path = fmt("%s/%s", ctx.cfg.cache_root, - cache_safe_filename(cgit_repo->url)); + cache_safe_filename(ctx.repo->url)); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; if (ctx.qry.page) { path = fmt("%s/%s/%s", ctx.cfg.cache_root, - cache_safe_filename(cgit_repo->url), + cache_safe_filename(ctx.repo->url), ctx.qry.page); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; diff --git a/cgit.c b/cgit.c index f0907a1..b270fdc 100644 --- a/cgit.c +++ b/cgit.c @@ -10,7 +10,7 @@ static int cgit_prepare_cache(struct cacheitem *item) { - if (!cgit_repo && ctx.qry.repo) { + if (!ctx.repo && ctx.qry.repo) { char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); @@ -19,7 +19,7 @@ static int cgit_prepare_cache(struct cacheitem *item) return 0; } - if (!cgit_repo) { + if (!ctx.repo) { item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root)); item->ttl = ctx.cfg.cache_root_ttl; return 1; @@ -27,12 +27,12 @@ static int cgit_prepare_cache(struct cacheitem *item) if (!cgit_cmd) { item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root, - cache_safe_filename(cgit_repo->url), + 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(cgit_repo->url), + cache_safe_filename(ctx.repo->url), ctx.qry.page, cache_safe_filename(ctx.qry.raw))); if (ctx.qry.has_symref) @@ -64,7 +64,7 @@ int find_current_ref(const char *refname, const unsigned char *sha1, return info->match; } -char *find_default_branch(struct repoinfo *repo) +char *find_default_branch(struct cgit_repo *repo) { struct refmatch info; @@ -84,7 +84,7 @@ static void cgit_print_repo_page(struct cacheitem *item) int show_search; unsigned char sha1[20]; - if (chdir(cgit_repo->path)) { + if (chdir(ctx.repo->path)) { title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); @@ -94,13 +94,13 @@ static void cgit_print_repo_page(struct cacheitem *item) return; } - title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc); + title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc); show_search = 0; - setenv("GIT_DIR", cgit_repo->path, 1); + setenv("GIT_DIR", ctx.repo->path, 1); if (!ctx.qry.head) { - ctx.qry.head = xstrdup(find_default_branch(cgit_repo)); - cgit_repo->defbranch = ctx.qry.head; + ctx.qry.head = xstrdup(find_default_branch(ctx.repo)); + ctx.repo->defbranch = ctx.qry.head; } if (!ctx.qry.head) { @@ -113,7 +113,7 @@ static void cgit_print_repo_page(struct cacheitem *item) if (get_sha1(ctx.qry.head, sha1)) { tmp = xstrdup(ctx.qry.head); - ctx.qry.head = cgit_repo->defbranch; + ctx.qry.head = ctx.repo->defbranch; cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); cgit_print_error(fmt("Invalid branch: %s", tmp)); @@ -121,11 +121,11 @@ static void cgit_print_repo_page(struct cacheitem *item) return; } - if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) { + if ((cgit_cmd == CMD_SNAPSHOT) && ctx.repo->snapshots) { cgit_print_snapshot(item, ctx.qry.head, ctx.qry.sha1, - cgit_repobasename(cgit_repo->url), + cgit_repobasename(ctx.repo->url), ctx.qry.path, - cgit_repo->snapshots ); + ctx.repo->snapshots ); return; } @@ -192,7 +192,7 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache) chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)"); } - if (cgit_repo) + if (ctx.repo) cgit_print_repo_page(item); else cgit_print_repolist(item); @@ -300,7 +300,6 @@ int main(int argc, const char **argv) cgit_read_config(cgit_config_env ? cgit_config_env : CGIT_CONFIG, cgit_global_config_cb); - cgit_repo = NULL; if (getenv("SCRIPT_NAME")) ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); if (getenv("QUERY_STRING")) diff --git a/cgit.h b/cgit.h index 0338ebd..598d8c3 100644 --- a/cgit.h +++ b/cgit.h @@ -66,7 +66,7 @@ struct cacheitem { int fd; }; -struct repoinfo { +struct cgit_repo { char *url; char *name; char *path; @@ -82,10 +82,10 @@ struct repoinfo { int enable_log_linecount; }; -struct repolist { +struct cgit_repolist { int length; int count; - struct repoinfo *repos; + struct cgit_repo *repos; }; struct commitinfo { @@ -177,12 +177,12 @@ struct cgit_config { struct cgit_context { struct cgit_query qry; struct cgit_config cfg; + struct cgit_repo *repo; }; extern const char *cgit_version; -extern struct repolist cgit_repolist; -extern struct repoinfo *cgit_repo; +extern struct cgit_repolist cgit_repolist; extern struct cgit_context ctx; extern int cgit_cmd; @@ -190,7 +190,7 @@ extern int htmlfd; extern void cgit_prepare_context(struct cgit_context *ctx); extern int cgit_get_cmd_index(const char *cmd); -extern struct repoinfo *cgit_get_repoinfo(const char *url); +extern struct cgit_repo *cgit_get_repoinfo(const char *url); extern void cgit_global_config_cb(const char *name, const char *value); extern void cgit_repo_config_cb(const char *name, const char *value); extern void cgit_querystring_cb(const char *name, const char *value); diff --git a/parsing.c b/parsing.c index 8cf56a4..027f06b 100644 --- a/parsing.c +++ b/parsing.c @@ -143,27 +143,27 @@ void cgit_parse_url(const char *url) { char *cmd, *p; - cgit_repo = NULL; + ctx.repo = NULL; if (!url || url[0] == '\0') return; - cgit_repo = cgit_get_repoinfo(url); - if (cgit_repo) { - ctx.qry.repo = cgit_repo->url; + ctx.repo = cgit_get_repoinfo(url); + if (ctx.repo) { + ctx.qry.repo = ctx.repo->url; return; } cmd = strchr(url, '/'); - while (!cgit_repo && cmd) { + while (!ctx.repo && cmd) { cmd[0] = '\0'; - cgit_repo = cgit_get_repoinfo(url); - if (cgit_repo == NULL) { + ctx.repo = cgit_get_repoinfo(url); + if (ctx.repo == NULL) { cmd[0] = '/'; cmd = strchr(cmd + 1, '/'); continue; } - ctx.qry.repo = cgit_repo->url; + ctx.qry.repo = ctx.repo->url; p = strchr(cmd + 1, '/'); if (p) { p[0] = '\0'; diff --git a/shared.c b/shared.c index 8dd2b00..808e674 100644 --- a/shared.c +++ b/shared.c @@ -8,8 +8,7 @@ #include "cgit.h" -struct repolist cgit_repolist; -struct repoinfo *cgit_repo; +struct cgit_repolist cgit_repolist; struct cgit_context ctx; int cgit_cmd; @@ -73,9 +72,9 @@ int chk_non_negative(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) @@ -84,7 +83,7 @@ struct repoinfo *add_repo(const char *url) 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]; @@ -103,10 +102,10 @@ struct repoinfo *add_repo(const char *url) 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]; @@ -179,32 +178,32 @@ void cgit_global_config_cb(const char *name, const char *value) 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); } @@ -213,7 +212,7 @@ void cgit_querystring_cb(const char *name, const char *value) { 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); diff --git a/ui-commit.c b/ui-commit.c index 3b0919b..25721ca 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -194,10 +194,10 @@ void cgit_print_commit(char *hex) sha1_to_hex(p->item->object.sha1), NULL); html(")</td></tr>"); } - if (cgit_repo->snapshots) { + if (ctx.repo->snapshots) { html("<tr><th>download</th><td colspan='2' class='sha1'>"); cgit_print_snapshot_links(ctx.qry.repo, ctx.qry.head, - hex, cgit_repo->snapshots); + hex, ctx.repo->snapshots); html("</td></tr>"); } html("</table>\n"); diff --git a/ui-log.c b/ui-log.c index a39474b..72e2a4b 100644 --- a/ui-log.c +++ b/ui-log.c @@ -25,7 +25,7 @@ void count_lines(char *line, int size) void inspect_files(struct diff_filepair *pair) { files++; - if (cgit_repo->enable_log_linecount) + if (ctx.repo->enable_log_linecount) cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines); } @@ -39,14 +39,14 @@ void print_commit(struct commit *commit) html("</td><td>"); 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("</td><td class='right'>"); htmlf("%d", files); - if (cgit_repo->enable_log_linecount) { + if (ctx.repo->enable_log_linecount) { html("</td><td class='right'>"); 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("<tr class='nohover'><th class='left'>Age</th>" "<th class='left'>Message</th>"); - if (cgit_repo->enable_log_filecount) { + if (ctx.repo->enable_log_filecount) { html("<th class='right'>Files</th>"); - if (cgit_repo->enable_log_linecount) + if (ctx.repo->enable_log_linecount) html("<th class='right'>Lines</th>"); } html("<th class='left'>Author</th></tr>\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("</tr>\n"); for (i=0; i<cgit_repolist.count; i++) { - cgit_repo = &cgit_repolist.repos[i]; - if ((last_group == NULL && cgit_repo->group != 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("<tr class='nohover'><td colspan='%d' class='repogroup'>", columns); - html_txt(cgit_repo->group); + html_txt(ctx.repo->group); html("</td></tr>"); - last_group = cgit_repo->group; + last_group = ctx.repo->group; } htmlf("<tr><td class='%s'>", - 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("</td><td>"); - html_ntxt(ctx.cfg.max_repodesc_len, cgit_repo->desc); + html_ntxt(ctx.cfg.max_repodesc_len, ctx.repo->desc); html("</td><td>"); - html_txt(cgit_repo->owner); + html_txt(ctx.repo->owner); html("</td><td>"); - print_modtime(cgit_repo); + print_modtime(ctx.repo); html("</td>"); if (ctx.cfg.enable_index_links) { html("<td>"); - html_link_open(cgit_repourl(cgit_repo->url), + html_link_open(cgit_repourl(ctx.repo->url), NULL, "button"); html("summary</a>"); 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("</td></tr>\n<tr><td class='sidebar'>\n"); if (ctx.qry.repo) { html("<h1 class='first'>"); - html_txt(strrpart(cgit_repo->name, 20)); + html_txt(strrpart(ctx.repo->name, 20)); html("</h1>\n"); - html_txt(cgit_repo->desc); - if (cgit_repo->owner) { + html_txt(ctx.repo->desc); + if (ctx.repo->owner) { html("<h1>owner</h1>\n"); - html_txt(cgit_repo->owner); + html_txt(ctx.repo->owner); } html("<h1>navigate</h1>\n"); reporevlink(NULL, "summary", NULL, "menu", ctx.qry.head, @@ -501,13 +501,13 @@ void cgit_print_pageheader(char *title, int show_search) for_each_ref(print_archive_ref, &header); - if (cgit_repo->clone_url || ctx.cfg.clone_prefix) { + if (ctx.repo->clone_url || ctx.cfg.clone_prefix) { html("<h1>clone</h1>\n"); - if (cgit_repo->clone_url) - url = cgit_repo->clone_url; + if (ctx.repo->clone_url) + url = ctx.repo->clone_url; else url = fmt("%s%s", ctx.cfg.clone_prefix, - cgit_repo->url); + ctx.repo->url); html("<a class='menu' href='"); html_attr(url); html("' title='"); diff --git a/ui-summary.c b/ui-summary.c index 0a44994..3baac08 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -182,9 +182,9 @@ void cgit_print_tags(int maxcount) void cgit_print_summary() { - if (cgit_repo->readme) { + if (ctx.repo->readme) { html("<div id='summary'>"); - html_include(cgit_repo->readme); + html_include(ctx.repo->readme); html("</div>"); } if (ctx.cfg.summary_log > 0) diff --git a/ui-tree.c b/ui-tree.c index 7cae85a..df05ad3 100644 --- a/ui-tree.c +++ b/ui-tree.c @@ -83,7 +83,7 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen, html("</td><td>"); if (S_ISGITLINK(mode)) { htmlf("<a class='ls-mod' href='"); - html_attr(fmt(cgit_repo->module_link, + html_attr(fmt(ctx.repo->module_link, name, sha1_to_hex(sha1))); html("'>"); -- cgit v1.2.3-54-g00ecf 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 <hjemli@gmail.com> --- cgit.c | 17 ++++++++--------- ui-shared.c | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) (limited to 'ui-shared.c') 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("'><img src='%s' alt='cgit'/></a>\n", ctx.cfg.logo); html("</td></tr>\n<tr><td class='sidebar'>\n"); - if (ctx.qry.repo) { + if (ctx.repo) { html("<h1 class='first'>"); html_txt(strrpart(ctx.repo->name, 20)); html("</h1>\n"); -- cgit v1.2.3-54-g00ecf From b1f9b9c1459cb9a30ebf80721aff6ef788d1f891 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sat, 23 Feb 2008 22:45:33 +0100 Subject: Introduce html.h All html-functions can be quite easily separated from the rest of cgit, so lets do it; the only issue was html_filemode which uses some git-defined macros so the function is moved into ui-shared.c::cgit_print_filemode(). Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.c | 1 - cgit.h | 15 +-------------- html.c | 31 ++++++++++++------------------- html.h | 18 ++++++++++++++++++ shared.c | 2 -- ui-blob.c | 9 +++++++++ ui-commit.c | 7 ++++--- ui-diff.c | 2 +- ui-log.c | 1 + ui-patch.c | 1 + ui-refs.c | 4 +--- ui-repolist.c | 3 ++- ui-shared.c | 16 ++++++++++++++++ ui-snapshot.c | 1 + ui-summary.c | 1 + ui-tag.c | 2 +- ui-tree.c | 3 ++- 17 files changed, 71 insertions(+), 46 deletions(-) create mode 100644 html.h (limited to 'ui-shared.c') diff --git a/cgit.c b/cgit.c index 2c933dc..e6b4526 100644 --- a/cgit.c +++ b/cgit.c @@ -291,7 +291,6 @@ int main(int argc, const char **argv) const char *cgit_config_env = getenv("CGIT_CONFIG"); cgit_prepare_context(&ctx); - htmlfd = STDOUT_FILENO; item.st.st_mtime = time(NULL); cgit_repolist.length = 0; cgit_repolist.count = 0; diff --git a/cgit.h b/cgit.h index 598d8c3..5b7ee1c 100644 --- a/cgit.h +++ b/cgit.h @@ -186,8 +186,6 @@ extern struct cgit_repolist cgit_repolist; extern struct cgit_context ctx; extern int cgit_cmd; -extern int htmlfd; - extern void cgit_prepare_context(struct cgit_context *ctx); extern int cgit_get_cmd_index(const char *cmd); extern struct cgit_repo *cgit_get_repoinfo(const char *url); @@ -222,18 +220,6 @@ extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); extern char *fmt(const char *format,...); -extern void html(const char *txt); -extern void htmlf(const char *format,...); -extern void html_txt(char *txt); -extern void html_ntxt(int len, char *txt); -extern void html_attr(char *txt); -extern void html_hidden(char *name, char *value); -extern void html_option(char *value, char *text, char *selected_value); -extern void html_link_open(char *url, char *title, char *class); -extern void html_link_close(void); -extern void html_filemode(unsigned short mode); -extern int html_include(const char *filename); - extern int cgit_read_config(const char *filename, configfn fn); extern int cgit_parse_query(char *txt, configfn fn); extern struct commitinfo *cgit_parse_commit(struct commit *commit); @@ -280,6 +266,7 @@ 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_filemode(unsigned short mode); extern void cgit_print_branches(int maxcount); extern void cgit_print_tags(int maxcount); diff --git a/html.c b/html.c index eb163d9..0962e71 100644 --- a/html.c +++ b/html.c @@ -6,7 +6,13 @@ * (see COPYING for full license text) */ -#include "cgit.h" +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> + +int htmlfd = STDOUT_FILENO; char *fmt(const char *format, ...) { @@ -21,8 +27,10 @@ char *fmt(const char *format, ...) va_start(args, format); len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args); va_end(args); - if (len>sizeof(buf[bufidx])) - die("[html.c] string truncated: %s", format); + if (len>sizeof(buf[bufidx])) { + fprintf(stderr, "[html.c] string truncated: %s\n", format); + exit(1); + } return buf[bufidx]; } @@ -160,25 +168,10 @@ void html_link_close(void) void html_fileperm(unsigned short mode) { - htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), + htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-')); } -void html_filemode(unsigned short mode) -{ - if (S_ISDIR(mode)) - html("d"); - else if (S_ISLNK(mode)) - html("l"); - else if (S_ISGITLINK(mode)) - html("m"); - else - html("-"); - html_fileperm(mode >> 6); - html_fileperm(mode >> 3); - html_fileperm(mode); -} - int html_include(const char *filename) { FILE *f; diff --git a/html.h b/html.h new file mode 100644 index 0000000..63f4551 --- /dev/null +++ b/html.h @@ -0,0 +1,18 @@ +#ifndef HTML_H +#define HTML_H + +extern int htmlfd; + +extern void html(const char *txt); +extern void htmlf(const char *format,...); +extern void html_txt(char *txt); +extern void html_ntxt(int len, char *txt); +extern void html_attr(char *txt); +extern void html_hidden(char *name, char *value); +extern void html_option(char *value, char *text, char *selected_value); +extern void html_link_open(char *url, char *title, char *class); +extern void html_link_close(void); +extern void html_fileperm(unsigned short mode); +extern int html_include(const char *filename); + +#endif /* HTML_H */ diff --git a/shared.c b/shared.c index 808e674..76e10d0 100644 --- a/shared.c +++ b/shared.c @@ -14,8 +14,6 @@ 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)); diff --git a/ui-blob.c b/ui-blob.c index f5b844b..be4fb88 100644 --- a/ui-blob.c +++ b/ui-blob.c @@ -1,4 +1,13 @@ +/* ui-blob.c: show blob content + * + * Copyright (C) 2008 Lars Hjemli + * + * Licensed under GNU General Public License v2 + * (see COPYING for full license text) + */ + #include "cgit.h" +#include "html.h" void cgit_print_blob(struct cacheitem *item, const char *hex, char *path) { diff --git a/ui-commit.c b/ui-commit.c index 25721ca..ed25824 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "html.h" static int files, slots; static int total_adds, total_rems, max_changes; @@ -62,16 +63,16 @@ void print_fileinfo(struct fileinfo *info) html("<tr>"); htmlf("<td class='mode'>"); 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("<span class='modechange'>["); - html_filemode(info->old_mode); + cgit_print_filemode(info->old_mode); html("]</span>"); } htmlf("</td><td class='%s'>", 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 <time.h> +#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[] = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n" @@ -567,4 +568,19 @@ void cgit_print_snapshot_start(const char *mimetype, const char *filename, html("\n"); } +void cgit_print_filemode(unsigned short mode) +{ + if (S_ISDIR(mode)) + html("d"); + else if (S_ISLNK(mode)) + html("l"); + else if (S_ISGITLINK(mode)) + html("m"); + else + html("-"); + html_fileperm(mode >> 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("<tr><td class='ls-mode'>"); - html_filemode(mode); + cgit_print_filemode(mode); html("</td><td>"); if (S_ISGITLINK(mode)) { htmlf("<a class='ls-mod' href='"); -- cgit v1.2.3-54-g00ecf From f3c1a187fe2bc33f8423cd535d5045899699995b Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Mar 2008 00:51:19 +0100 Subject: Add struct cgit_page to cgit_context This struct is used when generating http headers, and as such is another small step towards the goal of the whole cleanup series; to invoke each page/view function with a function pointer. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.c | 50 +++++++++++++++++--------- cgit.h | 18 +++++++--- shared.c | 3 ++ ui-blob.c | 4 ++- ui-patch.c | 4 ++- ui-repolist.c | 6 ++-- ui-shared.c | 112 ++++++++++++++++++++++++++-------------------------------- ui-snapshot.c | 4 ++- 8 files changed, 113 insertions(+), 88 deletions(-) (limited to 'ui-shared.c') diff --git a/cgit.c b/cgit.c index e6b4526..d0f6905 100644 --- a/cgit.c +++ b/cgit.c @@ -7,13 +7,16 @@ */ #include "cgit.h" +#include "cmd.h" static int cgit_prepare_cache(struct cacheitem *item) { if (!ctx.repo && ctx.qry.repo) { - char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); - cgit_print_docstart(title, item); - cgit_print_pageheader(title, 0); + 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; @@ -80,7 +83,7 @@ char *find_default_branch(struct cgit_repo *repo) static void cgit_print_repo_page(struct cacheitem *item) { - char *title, *tmp; + char *tmp; int show_search; unsigned char sha1[20]; int nongit = 0; @@ -88,17 +91,19 @@ static void cgit_print_repo_page(struct cacheitem *item) setenv("GIT_DIR", ctx.repo->path, 1); setup_git_directory_gently(&nongit); if (nongit) { - title = fmt("%s - %s", ctx.cfg.root_title, "config error"); + 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_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("<table summary='repository list' class='list nowrap'>"); 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("<div class='error'>"); @@ -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("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); html("<head>\n"); html("<title>"); - html_txt(title); + html_txt(ctx->page.title); html("</title>\n"); htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); - if (ctx.cfg.robots && *ctx.cfg.robots) - htmlf("<meta name='robots' content='%s'/>\n", ctx.cfg.robots); + if (ctx->cfg.robots && *ctx->cfg.robots) + htmlf("<meta name='robots' content='%s'/>\n", ctx->cfg.robots); html("<link rel='stylesheet' type='text/css' href='"); - html_attr(ctx.cfg.css); + html_attr(ctx->cfg.css); html("'/>\n"); html("</head>\n"); html("<body>\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("<tr><td class='sidebar'>\n<a href='"); html_attr(cgit_rooturl()); htmlf("'><img src='%s' alt='cgit'/></a>\n", - ctx.cfg.logo); + ctx->cfg.logo); html("</td></tr>\n<tr><td class='sidebar'>\n"); - if (ctx.repo) { + if (ctx->repo) { html("<h1 class='first'>"); - html_txt(strrpart(ctx.repo->name, 20)); + html_txt(strrpart(ctx->repo->name, 20)); html("</h1>\n"); - html_txt(ctx.repo->desc); - if (ctx.repo->owner) { + html_txt(ctx->repo->desc); + if (ctx->repo->owner) { html("<h1>owner</h1>\n"); - html_txt(ctx.repo->owner); + html_txt(ctx->repo->owner); } html("<h1>navigate</h1>\n"); - reporevlink(NULL, "summary", NULL, "menu", ctx.qry.head, + reporevlink(NULL, "summary", NULL, "menu", ctx->qry.head, NULL, NULL); - cgit_log_link("log", NULL, "menu", ctx.qry.head, NULL, NULL, + cgit_log_link("log", NULL, "menu", ctx->qry.head, NULL, NULL, 0, NULL, NULL); - cgit_tree_link("tree", NULL, "menu", ctx.qry.head, - ctx.qry.sha1, NULL); - cgit_commit_link("commit", NULL, "menu", ctx.qry.head, - ctx.qry.sha1); - cgit_diff_link("diff", NULL, "menu", ctx.qry.head, - ctx.qry.sha1, ctx.qry.sha2, NULL); - cgit_patch_link("patch", NULL, "menu", ctx.qry.head, - ctx.qry.sha1); + cgit_tree_link("tree", NULL, "menu", ctx->qry.head, + ctx->qry.sha1, NULL); + cgit_commit_link("commit", NULL, "menu", ctx->qry.head, + ctx->qry.sha1); + cgit_diff_link("diff", NULL, "menu", ctx->qry.head, + ctx->qry.sha1, ctx->qry.sha2, NULL); + cgit_patch_link("patch", NULL, "menu", ctx->qry.head, + ctx->qry.sha1); for_each_ref(print_archive_ref, &header); - if (ctx.repo->clone_url || ctx.cfg.clone_prefix) { + if (ctx->repo->clone_url || ctx->cfg.clone_prefix) { html("<h1>clone</h1>\n"); - if (ctx.repo->clone_url) - url = ctx.repo->clone_url; + if (ctx->repo->clone_url) + url = ctx->repo->clone_url; else - url = fmt("%s%s", ctx.cfg.clone_prefix, - ctx.repo->url); + url = fmt("%s%s", ctx->cfg.clone_prefix, + ctx->repo->url); html("<a class='menu' href='"); html_attr(url); html("' title='"); @@ -520,10 +522,10 @@ void cgit_print_pageheader(char *title, int show_search) html("<h1>branch</h1>\n"); html("<form method='get' action=''>\n"); - add_hidden_formfields(0, 1, ctx.qry.page); + add_hidden_formfields(0, 1, ctx->qry.page); // html("<table summary='branch selector' class='grid'><tr><td id='branch-dropdown-cell'>"); html("<select name='h' onchange='this.form.submit();'>\n"); - for_each_branch_ref(print_branch_option, ctx.qry.head); + for_each_branch_ref(print_branch_option, ctx->qry.head); html("</select>\n"); // html("</td><td>"); html("<noscript><input type='submit' id='switch-btn' value='switch'/></noscript>\n"); @@ -532,22 +534,22 @@ void cgit_print_pageheader(char *title, int show_search) html("<h1>search</h1>\n"); html("<form method='get' action='"); - if (ctx.cfg.virtual_root) - html_attr(cgit_fileurl(ctx.qry.repo, "log", - ctx.qry.path, NULL)); + if (ctx->cfg.virtual_root) + html_attr(cgit_fileurl(ctx->qry.repo, "log", + ctx->qry.path, NULL)); html("'>\n"); add_hidden_formfields(1, 0, "log"); html("<select name='qt'>\n"); - html_option("grep", "log msg", ctx.qry.grep); - html_option("author", "author", ctx.qry.grep); - html_option("committer", "committer", ctx.qry.grep); + html_option("grep", "log msg", ctx->qry.grep); + html_option("author", "author", ctx->qry.grep); + html_option("committer", "committer", ctx->qry.grep); html("</select>\n"); html("<input class='txt' type='text' name='q' value='"); - html_attr(ctx.qry.search); + html_attr(ctx->qry.search); html("'/>\n"); html("</form>\n"); } else { - if (!ctx.cfg.index_info || html_include(ctx.cfg.index_info)) + if (!ctx->cfg.index_info || html_include(ctx->cfg.index_info)) html(default_info); } @@ -556,18 +558,6 @@ void cgit_print_pageheader(char *title, int show_search) html("<td id='content'>\n"); } - -void cgit_print_snapshot_start(const char *mimetype, const char *filename, - struct cacheitem *item) -{ - htmlf("Content-Type: %s\n", mimetype); - htmlf("Content-Disposition: inline; filename=\"%s\"\n", filename); - 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))); - html("\n"); -} - void cgit_print_filemode(unsigned short mode) { if (S_ISDIR(mode)) diff --git a/ui-snapshot.c b/ui-snapshot.c index 67dbbdd..4449803 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -101,7 +101,9 @@ void cgit_print_snapshot(struct cacheitem *item, const char *head, args.base = fmt("%s/", prefix); args.tree = commit->tree; args.time = commit->date; - cgit_print_snapshot_start(sat->mimetype, filename, item); + ctx.page.mimetype = xstrdup(sat->mimetype); + ctx.page.filename = xstrdup(filename); + cgit_print_http_headers(&ctx); (*sat->write_func)(&args); return; } -- cgit v1.2.3-54-g00ecf From f34478cbe0214a201e7ecef3e79ed6c957b7beee Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Mar 2008 16:00:27 +0100 Subject: Refactor snapshot support The snapshot support needs to be split between output- and config-related functions to get the layering between shared.c and ui-*.c right. There is also some codestyle-issues which needs fixing to make the snapshot functions more similar to the rest of the cgit code. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.h | 8 ++++ shared.c | 27 +++++++++++++ ui-shared.c | 17 +++++++- ui-snapshot.c | 124 ++++++++++++++++++---------------------------------------- 4 files changed, 90 insertions(+), 86 deletions(-) (limited to 'ui-shared.c') diff --git a/cgit.h b/cgit.h index 295441b..e2d5126 100644 --- a/cgit.h +++ b/cgit.h @@ -177,10 +177,18 @@ struct cgit_context { struct cgit_page page; }; +struct cgit_snapshot_format { + const char *suffix; + const char *mimetype; + write_archive_fn_t write_func; + int bit; +}; + extern const char *cgit_version; extern struct cgit_repolist cgit_repolist; extern struct cgit_context ctx; +extern const struct cgit_snapshot_format cgit_snapshot_formats[]; extern int cgit_cmd; extern void cgit_prepare_context(struct cgit_context *ctx); diff --git a/shared.c b/shared.c index 67eb67b..800c06a 100644 --- a/shared.c +++ b/shared.c @@ -479,3 +479,30 @@ void cgit_diff_commit(struct commit *commit, filepair_fn fn) 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; +} diff --git a/ui-shared.c b/ui-shared.c index 2596023..aa65988 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -573,4 +573,19 @@ void cgit_print_filemode(unsigned short mode) html_fileperm(mode); } -/* vim:set sw=8: */ +void cgit_print_snapshot_links(const char *repo, const char *head, + const char *hex, int snapshots) +{ + const struct cgit_snapshot_format* f; + char *filename; + + for (f = cgit_snapshot_formats; f->suffix; f++) { + if (!(snapshots & f->bit)) + continue; + filename = fmt("%s-%s%s", cgit_repobasename(repo), hex, + f->suffix); + cgit_snapshot_link(filename, NULL, NULL, (char *)head, + (char *)hex, filename); + html("<br/>"); + } +} diff --git a/ui-snapshot.c b/ui-snapshot.c index c741469..512fcd2 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -55,105 +55,59 @@ static int write_tar_bzip2_archive(struct archiver_args *args) return write_compressed_tar_archive(args,"bzip2"); } -static const struct snapshot_archive_t { - const char *suffix; - const char *mimetype; - write_archive_fn_t write_func; - int bit; -} snapshot_archives[] = { +const struct cgit_snapshot_format cgit_snapshot_formats[] = { { ".zip", "application/x-zip", write_zip_archive, 0x1 }, { ".tar.gz", "application/x-tar", write_tar_gzip_archive, 0x2 }, { ".tar.bz2", "application/x-tar", write_tar_bzip2_archive, 0x4 }, - { ".tar", "application/x-tar", write_tar_archive, 0x8 } + { ".tar", "application/x-tar", write_tar_archive, 0x8 }, + {} }; -#define snapshot_archives_len (sizeof(snapshot_archives) / sizeof(*snapshot_archives)) - -void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, - const char *filename, int snapshots) +static int make_snapshot(const struct cgit_snapshot_format *format, + const char *hex, const char *prefix, + const char *filename) { - const struct snapshot_archive_t* sat; struct archiver_args args; struct commit *commit; unsigned char sha1[20]; - int f, sl, fnl = strlen(filename); - for(f=0; f<snapshot_archives_len; f++) { - sat = &snapshot_archives[f]; - if(!(snapshots & sat->bit)) - continue; - sl = strlen(sat->suffix); - if(fnl<sl || strcmp(&filename[fnl-sl],sat->suffix)) - continue; - if (!hex) - hex = head; - if(get_sha1(hex, sha1)) { - cgit_print_error(fmt("Bad object id: %s", hex)); - return; - } - commit = lookup_commit_reference(sha1); - if(!commit) { - cgit_print_error(fmt("Not a commit reference: %s", hex)); - return;; - } - memset(&args,0,sizeof(args)); - args.base = fmt("%s/", prefix); - args.tree = commit->tree; - args.time = commit->date; - ctx.page.mimetype = xstrdup(sat->mimetype); - ctx.page.filename = xstrdup(filename); - cgit_print_http_headers(&ctx); - (*sat->write_func)(&args); - return; + if(get_sha1(hex, sha1)) { + cgit_print_error(fmt("Bad object id: %s", hex)); + return 1; } - cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); -} - -void cgit_print_snapshot_links(const char *repo, const char *head, - const char *hex, int snapshots) -{ - const struct snapshot_archive_t* sat; - char *filename; - int f; - - for(f=0; f<snapshot_archives_len; f++) { - sat = &snapshot_archives[f]; - if(!(snapshots & sat->bit)) - continue; - filename = fmt("%s-%s%s", cgit_repobasename(repo), hex, - sat->suffix); - cgit_snapshot_link(filename, NULL, NULL, (char *)head, - (char *)hex, filename); - html("<br/>"); + commit = lookup_commit_reference(sha1); + if(!commit) { + cgit_print_error(fmt("Not a commit reference: %s", hex)); + return 1; } + memset(&args, 0, sizeof(args)); + args.base = fmt("%s/", prefix); + args.tree = commit->tree; + args.time = commit->date; + ctx.page.mimetype = xstrdup(format->mimetype); + ctx.page.filename = xstrdup(filename); + cgit_print_http_headers(&ctx); + format->write_func(&args); + return 0; } -int cgit_parse_snapshots_mask(const char *str) +void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, + const char *filename, int snapshots) { - const struct snapshot_archive_t* sat; - static const char *delim = " \t,:/|;"; - int f, 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=0; f<snapshot_archives_len; f++) { - sat = &snapshot_archives[f]; - sl = strlen(sat->suffix); - if((tl == sl && !strncmp(sat->suffix, str, tl)) || - (tl == sl-1 && !strncmp(sat->suffix+1, str, tl-1))) { - rv |= sat->bit; - break; - } - } - str += tl; + const struct cgit_snapshot_format* f; + int sl, fnl; + + fnl = strlen(filename); + if (!hex) + hex = head; + for (f = cgit_snapshot_formats; f->suffix; f++) { + if (!(snapshots & f->bit)) + continue; + sl = strlen(f->suffix); + if(fnl < sl || strcmp(&filename[fnl-sl], f->suffix)) + continue; + make_snapshot(f, hex, prefix, filename); + return; } - return rv; + cgit_print_error(fmt("Unsupported snapshot format: %s", filename)); } - -/* vim:set sw=8: */ -- cgit v1.2.3-54-g00ecf