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> --- cgit.h | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'cgit.h') 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; -- 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 'cgit.h') 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 'cgit.h') 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 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 'cgit.h') 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 'cgit.h') 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 b608e88adb6f77328288afb6dd0eddf674fc9b5b Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Mar 2008 01:00:36 +0100 Subject: Remove obsolete cacheitem parameter to ui-functions This parameter hasn't been used for a very long time... Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.c | 12 ++++++------ cgit.h | 12 ++++++------ ui-blob.c | 2 +- ui-patch.c | 2 +- ui-repolist.c | 2 +- ui-snapshot.c | 3 +-- 6 files changed, 16 insertions(+), 17 deletions(-) (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index d0f6905..a83f0be 100644 --- a/cgit.c +++ b/cgit.c @@ -81,7 +81,7 @@ char *find_default_branch(struct cgit_repo *repo) return info.first_ref; } -static void cgit_print_repo_page(struct cacheitem *item) +static void cgit_print_repo_page() { char *tmp; int show_search; @@ -132,7 +132,7 @@ static void cgit_print_repo_page(struct cacheitem *item) } if ((cgit_cmd == CMD_SNAPSHOT) && ctx.repo->snapshots) { - cgit_print_snapshot(item, ctx.qry.head, ctx.qry.sha1, + cgit_print_snapshot(ctx.qry.head, ctx.qry.sha1, cgit_repobasename(ctx.repo->url), ctx.qry.path, ctx.repo->snapshots ); @@ -140,12 +140,12 @@ static void cgit_print_repo_page(struct cacheitem *item) } if (cgit_cmd == CMD_PATCH) { - cgit_print_patch(ctx.qry.sha1, item); + cgit_print_patch(ctx.qry.sha1); return; } if (cgit_cmd == CMD_BLOB) { - cgit_print_blob(item, ctx.qry.sha1, ctx.qry.path); + cgit_print_blob(ctx.qry.sha1, ctx.qry.path); return; } @@ -210,9 +210,9 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache) ctx.page.modified = time(NULL); ctx.page.expires = ctx.page.modified + ttl_seconds(item->ttl); if (ctx.repo) - cgit_print_repo_page(item); + cgit_print_repo_page(); else - cgit_print_repolist(item); + cgit_print_repolist(); if (use_cache) { chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT"); diff --git a/cgit.h b/cgit.h index 8ab8e07..40e2d40 100644 --- a/cgit.h +++ b/cgit.h @@ -278,20 +278,20 @@ extern void cgit_print_filemode(unsigned short mode); extern void cgit_print_branches(int maxcount); extern void cgit_print_tags(int maxcount); -extern void cgit_print_repolist(struct cacheitem *item); +extern void cgit_print_repolist(); extern void cgit_print_summary(); extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern, char *path, int pager); -extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path); +extern void cgit_print_blob(const char *hex, char *path); extern void cgit_print_tree(const char *rev, char *path); extern void cgit_print_commit(char *hex); extern void cgit_print_refs(); extern void cgit_print_tag(char *revname); extern void cgit_print_diff(const char *new_hex, const char *old_hex, const char *prefix); -extern void cgit_print_patch(char *hex, struct cacheitem *item); -extern void cgit_print_snapshot(struct cacheitem *item, const char *head, - const char *hex, const char *prefix, - const char *filename, int snapshot); +extern void cgit_print_patch(char *hex); +extern void cgit_print_snapshot(const char *head, const char *hex, + const char *prefix, const char *filename, + int snapshot); extern void cgit_print_snapshot_links(const char *repo, const char *head, const char *hex, int snapshots); extern int cgit_parse_snapshots_mask(const char *str); diff --git a/ui-blob.c b/ui-blob.c index bd44574..3b29132 100644 --- a/ui-blob.c +++ b/ui-blob.c @@ -9,7 +9,7 @@ #include "cgit.h" #include "html.h" -void cgit_print_blob(struct cacheitem *item, const char *hex, char *path) +void cgit_print_blob(const char *hex, char *path) { unsigned char sha1[20]; diff --git a/ui-patch.c b/ui-patch.c index a77f3f6..68ebb15 100644 --- a/ui-patch.c +++ b/ui-patch.c @@ -69,7 +69,7 @@ static void filepair_cb(struct diff_filepair *pair) html("Error running diff"); } -void cgit_print_patch(char *hex, struct cacheitem *item) +void cgit_print_patch(char *hex) { struct commit *commit; struct commitinfo *info; diff --git a/ui-repolist.c b/ui-repolist.c index e663585..ad9b1bc 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -43,7 +43,7 @@ static void print_modtime(struct cgit_repo *repo) cgit_print_age(s.st_mtime, -1, NULL); } -void cgit_print_repolist(struct cacheitem *item) +void cgit_print_repolist() { int i, columns = 4; char *last_group = NULL; diff --git a/ui-snapshot.c b/ui-snapshot.c index 4449803..c741469 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -69,8 +69,7 @@ static const struct snapshot_archive_t { #define snapshot_archives_len (sizeof(snapshot_archives) / sizeof(*snapshot_archives)) -void cgit_print_snapshot(struct cacheitem *item, const char *head, - const char *hex, const char *prefix, +void cgit_print_snapshot(const char *head, const char *hex, const char *prefix, const char *filename, int snapshots) { const struct snapshot_archive_t* sat; -- cgit v1.2.3-54-g00ecf From e0e4478e7b4812f822d60a13a33525f8e529e1e8 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Mar 2008 01:09:39 +0100 Subject: Add command dispatcher This simplifies the code in cgit.c and makes it easier to extend cgit with new pages/commands. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- Makefile | 2 +- cgit.c | 130 ++++++++++++++++++++++++-------------------------------------- cgit.h | 14 ------- cmd.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ cmd.h | 15 ++++++++ parsing.c | 4 +- shared.c | 13 ------- 7 files changed, 169 insertions(+), 110 deletions(-) create mode 100644 cmd.c create mode 100644 cmd.h (limited to 'cgit.h') diff --git a/Makefile b/Makefile index 7102908..d9ff7d8 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2 EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \ ui-summary.o ui-log.o ui-tree.o ui-commit.o ui-diff.o \ - ui-snapshot.o ui-blob.o ui-tag.o ui-refs.o ui-patch.o + ui-snapshot.o ui-blob.o ui-tag.o ui-refs.o ui-patch.o cmd.o ifdef NEEDS_LIBICONV diff --git a/cgit.c b/cgit.c index a83f0be..79e0e43 100644 --- a/cgit.c +++ b/cgit.c @@ -81,111 +81,84 @@ char *find_default_branch(struct cgit_repo *repo) return info.first_ref; } -static void cgit_print_repo_page() +static int prepare_repo_cmd(struct cgit_context *ctx) { char *tmp; - int show_search; unsigned char sha1[20]; int nongit = 0; - setenv("GIT_DIR", ctx.repo->path, 1); + setenv("GIT_DIR", ctx->repo->path, 1); setup_git_directory_gently(&nongit); if (nongit) { - ctx.page.title = fmt("%s - %s", ctx.cfg.root_title, - "config error"); - tmp = fmt("Not a git repository: '%s'", ctx.repo->path); - ctx.repo = NULL; - cgit_print_http_headers(&ctx); - cgit_print_docstart(&ctx); - cgit_print_pageheader(&ctx); + ctx->page.title = fmt("%s - %s", ctx->cfg.root_title, + "config error"); + tmp = fmt("Not a git repository: '%s'", ctx->repo->path); + ctx->repo = NULL; + cgit_print_http_headers(ctx); + cgit_print_docstart(ctx); + cgit_print_pageheader(ctx); cgit_print_error(tmp); cgit_print_docend(); - return; + return 1; } + ctx->page.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) { - ctx.qry.head = xstrdup(find_default_branch(ctx.repo)); - ctx.repo->defbranch = ctx.qry.head; + if (!ctx->qry.head) { + ctx->qry.head = xstrdup(find_default_branch(ctx->repo)); + ctx->repo->defbranch = ctx->qry.head; } - if (!ctx.qry.head) { - cgit_print_http_headers(&ctx); - cgit_print_docstart(&ctx); - cgit_print_pageheader(&ctx); + if (!ctx->qry.head) { + cgit_print_http_headers(ctx); + cgit_print_docstart(ctx); + cgit_print_pageheader(ctx); cgit_print_error("Repository seems to be empty"); cgit_print_docend(); - return; + return 1; } - if (get_sha1(ctx.qry.head, sha1)) { - tmp = xstrdup(ctx.qry.head); - ctx.qry.head = ctx.repo->defbranch; - cgit_print_http_headers(&ctx); - cgit_print_docstart(&ctx); - cgit_print_pageheader(&ctx); + if (get_sha1(ctx->qry.head, sha1)) { + tmp = xstrdup(ctx->qry.head); + ctx->qry.head = ctx->repo->defbranch; + cgit_print_http_headers(ctx); + cgit_print_docstart(ctx); + cgit_print_pageheader(ctx); cgit_print_error(fmt("Invalid branch: %s", tmp)); cgit_print_docend(); - return; + return 1; } + return 0; +} - if ((cgit_cmd == CMD_SNAPSHOT) && ctx.repo->snapshots) { - cgit_print_snapshot(ctx.qry.head, ctx.qry.sha1, - cgit_repobasename(ctx.repo->url), - ctx.qry.path, - ctx.repo->snapshots ); +static void process_request(struct cgit_context *ctx) +{ + struct cgit_cmd *cmd; + + cmd = cgit_get_cmd(ctx); + if (!cmd) { + ctx->page.title = "cgit error"; + ctx->repo = NULL; + cgit_print_http_headers(ctx); + cgit_print_docstart(ctx); + cgit_print_pageheader(ctx); + cgit_print_error("Invalid request"); + cgit_print_docend(); return; } - if (cgit_cmd == CMD_PATCH) { - cgit_print_patch(ctx.qry.sha1); + if (cmd->want_repo && prepare_repo_cmd(ctx)) return; - } - if (cgit_cmd == CMD_BLOB) { - cgit_print_blob(ctx.qry.sha1, ctx.qry.path); - return; + if (cmd->want_layout) { + cgit_print_http_headers(ctx); + cgit_print_docstart(ctx); + cgit_print_pageheader(ctx); } - show_search = (cgit_cmd == CMD_LOG); - cgit_print_http_headers(&ctx); - cgit_print_docstart(&ctx); - if (!cgit_cmd) { - cgit_print_pageheader(&ctx); - cgit_print_summary(); - cgit_print_docend(); - return; - } + cmd->fn(ctx); - cgit_print_pageheader(&ctx); - - switch(cgit_cmd) { - case CMD_LOG: - cgit_print_log(ctx.qry.sha1, ctx.qry.ofs, - ctx.cfg.max_commit_count, ctx.qry.grep, ctx.qry.search, - ctx.qry.path, 1); - break; - case CMD_TREE: - cgit_print_tree(ctx.qry.sha1, ctx.qry.path); - break; - case CMD_COMMIT: - cgit_print_commit(ctx.qry.sha1); - break; - case CMD_REFS: - cgit_print_refs(); - break; - case CMD_TAG: - cgit_print_tag(ctx.qry.sha1); - break; - case CMD_DIFF: - cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path); - break; - default: - cgit_print_error("Invalid request"); - } - cgit_print_docend(); + if (cmd->want_layout) + cgit_print_docend(); } static long ttl_seconds(long ttl) @@ -209,10 +182,7 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache) ctx.page.modified = time(NULL); ctx.page.expires = ctx.page.modified + ttl_seconds(item->ttl); - if (ctx.repo) - cgit_print_repo_page(); - else - cgit_print_repolist(); + process_request(&ctx); if (use_cache) { chk_zero(close(STDOUT_FILENO), "Close redirected STDOUT"); diff --git a/cgit.h b/cgit.h index 40e2d40..295441b 100644 --- a/cgit.h +++ b/cgit.h @@ -19,19 +19,6 @@ #include <utf8.h> -/* - * The valid cgit repo-commands - */ -#define CMD_LOG 1 -#define CMD_COMMIT 2 -#define CMD_DIFF 3 -#define CMD_TREE 4 -#define CMD_BLOB 5 -#define CMD_SNAPSHOT 6 -#define CMD_TAG 7 -#define CMD_REFS 8 -#define CMD_PATCH 9 - /* * Dateformats used on misc. pages */ @@ -197,7 +184,6 @@ extern struct cgit_context ctx; extern int cgit_cmd; 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); extern void cgit_global_config_cb(const char *name, const char *value); extern void cgit_repo_config_cb(const char *name, const char *value); diff --git a/cmd.c b/cmd.c new file mode 100644 index 0000000..489a11c --- /dev/null +++ b/cmd.c @@ -0,0 +1,101 @@ +/* cmd.c: the cgit command dispatcher + * + * Copyright (C) 2008 Lars Hjemli + * + * Licensed under GNU General Public License v2 + * (see COPYING for full license text) + */ + +#include "cgit.h" +#include "cmd.h" + +static void blob_fn(struct cgit_context *ctx) +{ + cgit_print_blob(ctx->qry.sha1, ctx->qry.path); +} + +static void commit_fn(struct cgit_context *ctx) +{ + cgit_print_commit(ctx->qry.sha1); +} + +static void diff_fn(struct cgit_context *ctx) +{ + cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); +} + +static void repolist_fn(struct cgit_context *ctx) +{ + cgit_print_repolist(); +} + +static void log_fn(struct cgit_context *ctx) +{ + cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count, + ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1); +} + +static void patch_fn(struct cgit_context *ctx) +{ + cgit_print_patch(ctx->qry.sha1); +} + +static void refs_fn(struct cgit_context *ctx) +{ + cgit_print_refs(); +} + +static void snapshot_fn(struct cgit_context *ctx) +{ + cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, + cgit_repobasename(ctx->repo->url), ctx->qry.path, + ctx->repo->snapshots); +} + +static void summary_fn(struct cgit_context *ctx) +{ + cgit_print_summary(); +} + +static void tag_fn(struct cgit_context *ctx) +{ + cgit_print_tag(ctx->qry.sha1); +} + +static void tree_fn(struct cgit_context *ctx) +{ + cgit_print_tree(ctx->qry.sha1, ctx->qry.path); +} + +#define def_cmd(name, want_repo, want_layout) \ + {#name, name##_fn, want_repo, want_layout} + +struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) +{ + static struct cgit_cmd cmds[] = { + def_cmd(blob, 1, 0), + def_cmd(commit, 1, 1), + def_cmd(diff, 1, 1), + def_cmd(log, 1, 1), + def_cmd(patch, 1, 0), + def_cmd(refs, 1, 1), + def_cmd(repolist, 0, 0), + def_cmd(snapshot, 1, 0), + def_cmd(summary, 1, 1), + def_cmd(tag, 1, 1), + def_cmd(tree, 1, 1), + }; + int i; + + if (ctx->qry.page == NULL) { + if (ctx->repo) + ctx->qry.page = "summary"; + else + ctx->qry.page = "repolist"; + } + + for(i = 0; i < sizeof(cmds)/sizeof(*cmds); i++) + if (!strcmp(ctx->qry.page, cmds[i].name)) + return &cmds[i]; + return NULL; +} diff --git a/cmd.h b/cmd.h new file mode 100644 index 0000000..ec9e691 --- /dev/null +++ b/cmd.h @@ -0,0 +1,15 @@ +#ifndef CMD_H +#define CMD_H + +typedef void (*cgit_cmd_fn)(struct cgit_context *ctx); + +struct cgit_cmd { + const char *name; + cgit_cmd_fn fn; + unsigned int want_repo:1, + want_layout:1; +}; + +extern struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx); + +#endif /* CMD_H */ diff --git a/parsing.c b/parsing.c index 027f06b..8dce488 100644 --- a/parsing.c +++ b/parsing.c @@ -170,8 +170,8 @@ void cgit_parse_url(const char *url) if (p[1]) ctx.qry.path = trim_end(p + 1, '/'); } - cgit_cmd = cgit_get_cmd_index(cmd + 1); - ctx.qry.page = xstrdup(cmd + 1); + if (cmd[1]) + ctx.qry.page = xstrdup(cmd + 1); return; } } diff --git a/shared.c b/shared.c index 539d533..67eb67b 100644 --- a/shared.c +++ b/shared.c @@ -40,18 +40,6 @@ void cgit_prepare_context(struct cgit_context *ctx) ctx->page.filename = NULL; } -int cgit_get_cmd_index(const char *cmd) -{ - static char *cmds[] = {"log", "commit", "diff", "tree", "blob", - "snapshot", "tag", "refs", "patch", NULL}; - int i; - - for(i = 0; cmds[i]; i++) - if (!strcmp(cmd, cmds[i])) - return i + 1; - return 0; -} - int chk_zero(int result, char *msg) { if (result != 0) @@ -216,7 +204,6 @@ void cgit_querystring_cb(const char *name, const char *value) ctx.repo = cgit_get_repoinfo(value); } else if (!strcmp(name, "p")) { ctx.qry.page = xstrdup(value); - cgit_cmd = cgit_get_cmd_index(value); } else if (!strcmp(name, "url")) { cgit_parse_url(value); } else if (!strcmp(name, "qt")) { -- 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 'cgit.h') 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 From c5984a9896b39748e61daf6e620483749654b102 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Mar 2008 16:38:47 +0100 Subject: Add separate header-files for each page/view Yet another step towards removing cgit.h. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.h | 17 ------ cmd.c | 11 ++++ ui-blob.h | 6 ++ ui-commit.h | 6 ++ ui-diff.h | 7 +++ ui-log.h | 7 +++ ui-patch.h | 6 ++ ui-refs.c | 172 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ui-refs.h | 8 +++ ui-repolist.h | 6 ++ ui-snapshot.h | 8 +++ ui-summary.c | 174 +--------------------------------------------------------- ui-summary.h | 6 ++ ui-tag.h | 6 ++ ui-tree.h | 6 ++ 15 files changed, 257 insertions(+), 189 deletions(-) create mode 100644 ui-blob.h create mode 100644 ui-commit.h create mode 100644 ui-diff.h create mode 100644 ui-log.h create mode 100644 ui-patch.h create mode 100644 ui-refs.h create mode 100644 ui-repolist.h create mode 100644 ui-snapshot.h create mode 100644 ui-summary.h create mode 100644 ui-tag.h create mode 100644 ui-tree.h (limited to 'cgit.h') diff --git a/cgit.h b/cgit.h index e2d5126..1b23369 100644 --- a/cgit.h +++ b/cgit.h @@ -269,23 +269,6 @@ extern void cgit_print_docstart(struct cgit_context *ctx); extern void cgit_print_docend(); 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); - -extern void cgit_print_repolist(); -extern void cgit_print_summary(); -extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, - char *pattern, char *path, int pager); -extern void cgit_print_blob(const char *hex, char *path); -extern void cgit_print_tree(const char *rev, char *path); -extern void cgit_print_commit(char *hex); -extern void cgit_print_refs(); -extern void cgit_print_tag(char *revname); -extern void cgit_print_diff(const char *new_hex, const char *old_hex, const char *prefix); -extern void cgit_print_patch(char *hex); -extern void cgit_print_snapshot(const char *head, const char *hex, - const char *prefix, const char *filename, - int snapshot); extern void cgit_print_snapshot_links(const char *repo, const char *head, const char *hex, int snapshots); extern int cgit_parse_snapshots_mask(const char *str); diff --git a/cmd.c b/cmd.c index 489a11c..e0eacbe 100644 --- a/cmd.c +++ b/cmd.c @@ -8,6 +8,17 @@ #include "cgit.h" #include "cmd.h" +#include "ui-blob.h" +#include "ui-commit.h" +#include "ui-diff.h" +#include "ui-log.h" +#include "ui-patch.h" +#include "ui-refs.h" +#include "ui-repolist.h" +#include "ui-snapshot.h" +#include "ui-summary.h" +#include "ui-tag.h" +#include "ui-tree.h" static void blob_fn(struct cgit_context *ctx) { diff --git a/ui-blob.h b/ui-blob.h new file mode 100644 index 0000000..5a920a8 --- /dev/null +++ b/ui-blob.h @@ -0,0 +1,6 @@ +#ifndef UI_BLOB_H +#define UI_BLOB_H + +extern void cgit_print_blob(const char *hex, char *path); + +#endif /* UI_BLOB_H */ diff --git a/ui-commit.h b/ui-commit.h new file mode 100644 index 0000000..40bcb31 --- /dev/null +++ b/ui-commit.h @@ -0,0 +1,6 @@ +#ifndef UI_COMMIT_H +#define UI_COMMIT_H + +extern void cgit_print_commit(char *hex); + +#endif /* UI_COMMIT_H */ diff --git a/ui-diff.h b/ui-diff.h new file mode 100644 index 0000000..2307322 --- /dev/null +++ b/ui-diff.h @@ -0,0 +1,7 @@ +#ifndef UI_DIFF_H +#define UI_DIFF_H + +extern void cgit_print_diff(const char *new_hex, const char *old_hex, + const char *prefix); + +#endif /* UI_DIFF_H */ diff --git a/ui-log.h b/ui-log.h new file mode 100644 index 0000000..877e40e --- /dev/null +++ b/ui-log.h @@ -0,0 +1,7 @@ +#ifndef UI_LOG_H +#define UI_LOG_H + +extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, + char *pattern, char *path, int pager); + +#endif /* UI_LOG_H */ diff --git a/ui-patch.h b/ui-patch.h new file mode 100644 index 0000000..9f68212 --- /dev/null +++ b/ui-patch.h @@ -0,0 +1,6 @@ +#ifndef UI_PATCH_H +#define UI_PATCH_H + +extern void cgit_print_patch(char *hex); + +#endif /* UI_PATCH_H */ diff --git a/ui-refs.c b/ui-refs.c index e2a16f4..fc82ca7 100644 --- a/ui-refs.c +++ b/ui-refs.c @@ -9,6 +9,178 @@ #include "cgit.h" #include "html.h" +static int header; + +static int cmp_age(int age1, int age2) +{ + if (age1 != 0 && age2 != 0) + return age2 - age1; + + if (age1 == 0 && age2 == 0) + return 0; + + if (age1 == 0) + return +1; + + return -1; +} + +static int cmp_ref_name(const void *a, const void *b) +{ + struct refinfo *r1 = *(struct refinfo **)a; + struct refinfo *r2 = *(struct refinfo **)b; + + return strcmp(r1->refname, r2->refname); +} + +static int cmp_branch_age(const void *a, const void *b) +{ + struct refinfo *r1 = *(struct refinfo **)a; + struct refinfo *r2 = *(struct refinfo **)b; + + return cmp_age(r1->commit->committer_date, r2->commit->committer_date); +} + +static int cmp_tag_age(const void *a, const void *b) +{ + struct refinfo *r1 = *(struct refinfo **)a; + struct refinfo *r2 = *(struct refinfo **)b; + + return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date); +} + +static int print_branch(struct refinfo *ref) +{ + struct commitinfo *info = ref->commit; + char *name = (char *)ref->refname; + + if (!info) + return 1; + html("<tr><td>"); + cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0, NULL, NULL); + html("</td><td>"); + + if (ref->object->type == OBJ_COMMIT) { + cgit_print_age(info->commit->date, -1, NULL); + html("</td><td>"); + html_txt(info->author); + html("</td><td>"); + cgit_commit_link(info->subject, NULL, NULL, name, NULL); + } else { + html("</td><td></td><td>"); + cgit_object_link(ref->object); + } + html("</td></tr>\n"); + return 0; +} + +static void print_tag_header() +{ + html("<tr class='nohover'><th class='left'>Tag</th>" + "<th class='left'>Age</th>" + "<th class='left'>Author</th>" + "<th class='left'>Reference</th></tr>\n"); + header = 1; +} + +static int print_tag(struct refinfo *ref) +{ + struct tag *tag; + struct taginfo *info; + char *url, *name = (char *)ref->refname; + + if (ref->object->type == OBJ_TAG) { + tag = (struct tag *)ref->object; + info = ref->tag; + if (!tag || !info) + return 1; + html("<tr><td>"); + url = cgit_pageurl(ctx.qry.repo, "tag", + fmt("id=%s", name)); + html_link_open(url, NULL, NULL); + html_txt(name); + html_link_close(); + html("</td><td>"); + if (info->tagger_date > 0) + cgit_print_age(info->tagger_date, -1, NULL); + html("</td><td>"); + if (info->tagger) + html(info->tagger); + html("</td><td>"); + cgit_object_link(tag->tagged); + html("</td></tr>\n"); + } else { + if (!header) + print_tag_header(); + html("<tr><td>"); + html_txt(name); + html("</td><td colspan='2'/><td>"); + cgit_object_link(ref->object); + html("</td></tr>\n"); + } + return 0; +} + +static void print_refs_link(char *path) +{ + html("<tr class='nohover'><td colspan='4'>"); + cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path); + html("</td></tr>"); +} + +void cgit_print_branches(int maxcount) +{ + struct reflist list; + int i; + + html("<tr class='nohover'><th class='left'>Branch</th>" + "<th class='left'>Idle</th>" + "<th class='left'>Author</th>" + "<th class='left'>Head commit</th></tr>\n"); + + list.refs = NULL; + list.alloc = list.count = 0; + for_each_branch_ref(cgit_refs_cb, &list); + + if (maxcount == 0 || maxcount > list.count) + maxcount = list.count; + + if (maxcount < list.count) { + qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age); + qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name); + } + + for(i=0; i<maxcount; i++) + print_branch(list.refs[i]); + + if (maxcount < list.count) + print_refs_link("heads"); +} + +void cgit_print_tags(int maxcount) +{ + struct reflist list; + int i; + + header = 0; + list.refs = NULL; + list.alloc = list.count = 0; + for_each_tag_ref(cgit_refs_cb, &list); + if (list.count == 0) + return; + qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age); + if (!maxcount) + maxcount = list.count; + else if (maxcount > list.count) + maxcount = list.count; + print_tag_header(); + for(i=0; i<maxcount; i++) + print_tag(list.refs[i]); + + if (maxcount < list.count) + print_refs_link("tags"); +} + void cgit_print_refs() { diff --git a/ui-refs.h b/ui-refs.h new file mode 100644 index 0000000..b35c04a --- /dev/null +++ b/ui-refs.h @@ -0,0 +1,8 @@ +#ifndef UI_REFS_H +#define UI_REFS_H + +extern void cgit_print_branches(int maxcount); +extern void cgit_print_tags(int maxcount); +extern void cgit_print_refs(); + +#endif /* UI_REFS_H */ diff --git a/ui-repolist.h b/ui-repolist.h new file mode 100644 index 0000000..c23e5d2 --- /dev/null +++ b/ui-repolist.h @@ -0,0 +1,6 @@ +#ifndef UI_REPOLIST_H +#define UI_REPOLIST_H + +extern void cgit_print_repolist(); + +#endif /* UI_REPOLIST_H */ diff --git a/ui-snapshot.h b/ui-snapshot.h new file mode 100644 index 0000000..6e03761 --- /dev/null +++ b/ui-snapshot.h @@ -0,0 +1,8 @@ +#ifndef UI_SNAPSHOT_H +#define UI_SNAPSHOT_H + +extern void cgit_print_snapshot(const char *head, const char *hex, + const char *prefix, const char *filename, + int snapshot); + +#endif /* UI_SNAPSHOT_H */ diff --git a/ui-summary.c b/ui-summary.c index 0afa0a3..0b66b52 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -8,178 +8,8 @@ #include "cgit.h" #include "html.h" - -static int header; - -static int cmp_age(int age1, int age2) -{ - if (age1 != 0 && age2 != 0) - return age2 - age1; - - if (age1 == 0 && age2 == 0) - return 0; - - if (age1 == 0) - return +1; - - return -1; -} - -static int cmp_ref_name(const void *a, const void *b) -{ - struct refinfo *r1 = *(struct refinfo **)a; - struct refinfo *r2 = *(struct refinfo **)b; - - return strcmp(r1->refname, r2->refname); -} - -static int cmp_branch_age(const void *a, const void *b) -{ - struct refinfo *r1 = *(struct refinfo **)a; - struct refinfo *r2 = *(struct refinfo **)b; - - return cmp_age(r1->commit->committer_date, r2->commit->committer_date); -} - -static int cmp_tag_age(const void *a, const void *b) -{ - struct refinfo *r1 = *(struct refinfo **)a; - struct refinfo *r2 = *(struct refinfo **)b; - - return cmp_age(r1->tag->tagger_date, r2->tag->tagger_date); -} - -static int print_branch(struct refinfo *ref) -{ - struct commitinfo *info = ref->commit; - char *name = (char *)ref->refname; - - if (!info) - return 1; - html("<tr><td>"); - cgit_log_link(name, NULL, NULL, name, NULL, NULL, 0, NULL, NULL); - html("</td><td>"); - - if (ref->object->type == OBJ_COMMIT) { - cgit_print_age(info->commit->date, -1, NULL); - html("</td><td>"); - html_txt(info->author); - html("</td><td>"); - cgit_commit_link(info->subject, NULL, NULL, name, NULL); - } else { - html("</td><td></td><td>"); - cgit_object_link(ref->object); - } - html("</td></tr>\n"); - return 0; -} - -static void print_tag_header() -{ - html("<tr class='nohover'><th class='left'>Tag</th>" - "<th class='left'>Age</th>" - "<th class='left'>Author</th>" - "<th class='left'>Reference</th></tr>\n"); - header = 1; -} - -static int print_tag(struct refinfo *ref) -{ - struct tag *tag; - struct taginfo *info; - char *url, *name = (char *)ref->refname; - - if (ref->object->type == OBJ_TAG) { - tag = (struct tag *)ref->object; - info = ref->tag; - if (!tag || !info) - return 1; - html("<tr><td>"); - url = cgit_pageurl(ctx.qry.repo, "tag", - fmt("id=%s", name)); - html_link_open(url, NULL, NULL); - html_txt(name); - html_link_close(); - html("</td><td>"); - if (info->tagger_date > 0) - cgit_print_age(info->tagger_date, -1, NULL); - html("</td><td>"); - if (info->tagger) - html(info->tagger); - html("</td><td>"); - cgit_object_link(tag->tagged); - html("</td></tr>\n"); - } else { - if (!header) - print_tag_header(); - html("<tr><td>"); - html_txt(name); - html("</td><td colspan='2'/><td>"); - cgit_object_link(ref->object); - html("</td></tr>\n"); - } - return 0; -} - -static void print_refs_link(char *path) -{ - html("<tr class='nohover'><td colspan='4'>"); - cgit_refs_link("[...]", NULL, NULL, ctx.qry.head, NULL, path); - html("</td></tr>"); -} - -void cgit_print_branches(int maxcount) -{ - struct reflist list; - int i; - - html("<tr class='nohover'><th class='left'>Branch</th>" - "<th class='left'>Idle</th>" - "<th class='left'>Author</th>" - "<th class='left'>Head commit</th></tr>\n"); - - list.refs = NULL; - list.alloc = list.count = 0; - for_each_branch_ref(cgit_refs_cb, &list); - - if (maxcount == 0 || maxcount > list.count) - maxcount = list.count; - - if (maxcount < list.count) { - qsort(list.refs, list.count, sizeof(*list.refs), cmp_branch_age); - qsort(list.refs, maxcount, sizeof(*list.refs), cmp_ref_name); - } - - for(i=0; i<maxcount; i++) - print_branch(list.refs[i]); - - if (maxcount < list.count) - print_refs_link("heads"); -} - -void cgit_print_tags(int maxcount) -{ - struct reflist list; - int i; - - header = 0; - list.refs = NULL; - list.alloc = list.count = 0; - for_each_tag_ref(cgit_refs_cb, &list); - if (list.count == 0) - return; - qsort(list.refs, list.count, sizeof(*list.refs), cmp_tag_age); - if (!maxcount) - maxcount = list.count; - else if (maxcount > list.count) - maxcount = list.count; - print_tag_header(); - for(i=0; i<maxcount; i++) - print_tag(list.refs[i]); - - if (maxcount < list.count) - print_refs_link("tags"); -} +#include "ui-log.h" +#include "ui-refs.h" void cgit_print_summary() { diff --git a/ui-summary.h b/ui-summary.h new file mode 100644 index 0000000..37aedd2 --- /dev/null +++ b/ui-summary.h @@ -0,0 +1,6 @@ +#ifndef UI_SUMMARY_H +#define UI_SUMMARY_H + +extern void cgit_print_summary(); + +#endif /* UI_SUMMARY_H */ diff --git a/ui-tag.h b/ui-tag.h new file mode 100644 index 0000000..d295cdc --- /dev/null +++ b/ui-tag.h @@ -0,0 +1,6 @@ +#ifndef UI_TAG_H +#define UI_TAG_H + +extern void cgit_print_tag(char *revname); + +#endif /* UI_TAG_H */ diff --git a/ui-tree.h b/ui-tree.h new file mode 100644 index 0000000..bbd34e3 --- /dev/null +++ b/ui-tree.h @@ -0,0 +1,6 @@ +#ifndef UI_TREE_H +#define UI_TREE_H + +extern void cgit_print_tree(const char *rev, char *path); + +#endif /* UI_TREE_H */ -- cgit v1.2.3-54-g00ecf From a4d1ca1dc6ff8171694d9e2280b6075a1beced0c Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Mar 2008 16:50:57 +0100 Subject: Add ui-shared.h This is finally a proper headerfile for the shared ui-functions which used to reside in cgit.h Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.c | 1 + cgit.h | 32 -------------------------------- ui-blob.c | 1 + ui-commit.c | 1 + ui-diff.c | 1 + ui-log.c | 1 + ui-patch.c | 1 + ui-refs.c | 1 + ui-repolist.c | 1 + ui-shared.h | 36 ++++++++++++++++++++++++++++++++++++ ui-snapshot.c | 1 + ui-tag.c | 1 + ui-tree.c | 1 + 13 files changed, 47 insertions(+), 32 deletions(-) create mode 100644 ui-shared.h (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index 79e0e43..dbb023e 100644 --- a/cgit.c +++ b/cgit.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "cmd.h" +#include "ui-shared.h" static int cgit_prepare_cache(struct cacheitem *item) { diff --git a/cgit.h b/cgit.h index 1b23369..c1a231d 100644 --- a/cgit.h +++ b/cgit.h @@ -237,40 +237,8 @@ extern int cache_cancel_lock(struct cacheitem *item); extern int cache_exist(struct cacheitem *item); extern int cache_expired(struct cacheitem *item); -extern char *cgit_repourl(const char *reponame); -extern char *cgit_fileurl(const char *reponame, const char *pagename, - const char *filename, const char *query); -extern char *cgit_pageurl(const char *reponame, const char *pagename, - const char *query); - extern const char *cgit_repobasename(const char *reponame); -extern void cgit_tree_link(char *name, char *title, char *class, char *head, - char *rev, char *path); -extern void cgit_log_link(char *name, char *title, char *class, char *head, - char *rev, char *path, int ofs, char *grep, - char *pattern); -extern void cgit_commit_link(char *name, char *title, char *class, char *head, - char *rev); -extern void cgit_refs_link(char *name, char *title, char *class, char *head, - char *rev, char *path); -extern void cgit_snapshot_link(char *name, char *title, char *class, - char *head, char *rev, char *archivename); -extern void cgit_diff_link(char *name, char *title, char *class, char *head, - char *new_rev, char *old_rev, char *path); - -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_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(struct cgit_context *ctx); -extern void cgit_print_filemode(unsigned short mode); -extern void cgit_print_snapshot_links(const char *repo, const char *head, - const char *hex, int snapshots); extern int cgit_parse_snapshots_mask(const char *str); #endif /* CGIT_H */ diff --git a/ui-blob.c b/ui-blob.c index 3b29132..11589db 100644 --- a/ui-blob.c +++ b/ui-blob.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" void cgit_print_blob(const char *hex, char *path) { diff --git a/ui-commit.c b/ui-commit.c index ed25824..8019e36 100644 --- a/ui-commit.c +++ b/ui-commit.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" static int files, slots; static int total_adds, total_rems, max_changes; diff --git a/ui-diff.c b/ui-diff.c index 5c3bc98..2a22009 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" unsigned char old_rev_sha1[20]; unsigned char new_rev_sha1[20]; diff --git a/ui-log.c b/ui-log.c index e1d324d..60c9269 100644 --- a/ui-log.c +++ b/ui-log.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" int files, add_lines, rem_lines; diff --git a/ui-patch.c b/ui-patch.c index 68ebb15..36bfae4 100644 --- a/ui-patch.c +++ b/ui-patch.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" static void print_line(char *line, int len) { diff --git a/ui-refs.c b/ui-refs.c index fc82ca7..12533cd 100644 --- a/ui-refs.c +++ b/ui-refs.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" static int header; diff --git a/ui-repolist.c b/ui-repolist.c index ad9b1bc..eeeaf3d 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -10,6 +10,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" time_t read_agefile(char *path) { diff --git a/ui-shared.h b/ui-shared.h new file mode 100644 index 0000000..94de884 --- /dev/null +++ b/ui-shared.h @@ -0,0 +1,36 @@ +#ifndef UI_SHARED_H +#define UI_SHARED_H + +extern char *cgit_repourl(const char *reponame); +extern char *cgit_fileurl(const char *reponame, const char *pagename, + const char *filename, const char *query); +extern char *cgit_pageurl(const char *reponame, const char *pagename, + const char *query); + +extern void cgit_tree_link(char *name, char *title, char *class, char *head, + char *rev, char *path); +extern void cgit_log_link(char *name, char *title, char *class, char *head, + char *rev, char *path, int ofs, char *grep, + char *pattern); +extern void cgit_commit_link(char *name, char *title, char *class, char *head, + char *rev); +extern void cgit_refs_link(char *name, char *title, char *class, char *head, + char *rev, char *path); +extern void cgit_snapshot_link(char *name, char *title, char *class, + char *head, char *rev, char *archivename); +extern void cgit_diff_link(char *name, char *title, char *class, char *head, + char *new_rev, char *old_rev, char *path); +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_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(struct cgit_context *ctx); +extern void cgit_print_filemode(unsigned short mode); +extern void cgit_print_snapshot_links(const char *repo, const char *head, + const char *hex, int snapshots); + +#endif /* UI_SHARED_H */ diff --git a/ui-snapshot.c b/ui-snapshot.c index 512fcd2..966a140 100644 --- a/ui-snapshot.c +++ b/ui-snapshot.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" static int write_compressed_tar_archive(struct archiver_args *args,const char *filter) { diff --git a/ui-tag.c b/ui-tag.c index 2998d02..ab2c66d 100644 --- a/ui-tag.c +++ b/ui-tag.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" static void print_tag_content(char *buf) { diff --git a/ui-tree.c b/ui-tree.c index 7912784..9be3140 100644 --- a/ui-tree.c +++ b/ui-tree.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "ui-shared.h" char *curr_rev; char *match_path; -- cgit v1.2.3-54-g00ecf From 163037e79c6cde1073d555dbeae2a095298e6101 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Mon, 24 Mar 2008 17:26:08 +0100 Subject: Move non-generic functions from shared.c to cgit.c Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- cgit.h | 4 +- shared.c | 152 +------------------------------------------------------------ 3 files changed, 155 insertions(+), 157 deletions(-) (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index dbb023e..b3dd119 100644 --- a/cgit.c +++ b/cgit.c @@ -10,6 +10,156 @@ #include "cmd.h" #include "ui-shared.h" +void config_cb(const char *name, const char *value) +{ + if (!strcmp(name, "root-title")) + ctx.cfg.root_title = xstrdup(value); + else if (!strcmp(name, "css")) + ctx.cfg.css = xstrdup(value); + else if (!strcmp(name, "logo")) + ctx.cfg.logo = xstrdup(value); + else if (!strcmp(name, "index-header")) + ctx.cfg.index_header = xstrdup(value); + else if (!strcmp(name, "index-info")) + ctx.cfg.index_info = xstrdup(value); + else if (!strcmp(name, "logo-link")) + ctx.cfg.logo_link = xstrdup(value); + else if (!strcmp(name, "module-link")) + ctx.cfg.module_link = xstrdup(value); + else if (!strcmp(name, "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")) + ctx.cfg.nocache = atoi(value); + else if (!strcmp(name, "snapshots")) + ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); + else if (!strcmp(name, "enable-index-links")) + ctx.cfg.enable_index_links = atoi(value); + else if (!strcmp(name, "enable-log-filecount")) + ctx.cfg.enable_log_filecount = atoi(value); + else if (!strcmp(name, "enable-log-linecount")) + ctx.cfg.enable_log_linecount = atoi(value); + else if (!strcmp(name, "cache-root")) + ctx.cfg.cache_root = xstrdup(value); + else if (!strcmp(name, "cache-root-ttl")) + ctx.cfg.cache_root_ttl = atoi(value); + else if (!strcmp(name, "cache-repo-ttl")) + ctx.cfg.cache_repo_ttl = atoi(value); + else if (!strcmp(name, "cache-static-ttl")) + ctx.cfg.cache_static_ttl = atoi(value); + else if (!strcmp(name, "cache-dynamic-ttl")) + ctx.cfg.cache_dynamic_ttl = atoi(value); + else if (!strcmp(name, "max-message-length")) + ctx.cfg.max_msg_len = atoi(value); + else if (!strcmp(name, "max-repodesc-length")) + ctx.cfg.max_repodesc_len = atoi(value); + else if (!strcmp(name, "max-commit-count")) + ctx.cfg.max_commit_count = atoi(value); + else if (!strcmp(name, "summary-log")) + ctx.cfg.summary_log = atoi(value); + else if (!strcmp(name, "summary-branches")) + ctx.cfg.summary_branches = atoi(value); + else if (!strcmp(name, "summary-tags")) + ctx.cfg.summary_tags = atoi(value); + else if (!strcmp(name, "agefile")) + ctx.cfg.agefile = xstrdup(value); + else if (!strcmp(name, "renamelimit")) + ctx.cfg.renamelimit = atoi(value); + else if (!strcmp(name, "robots")) + ctx.cfg.robots = xstrdup(value); + else if (!strcmp(name, "clone-prefix")) + ctx.cfg.clone_prefix = xstrdup(value); + else if (!strcmp(name, "repo.group")) + ctx.cfg.repo_group = xstrdup(value); + else if (!strcmp(name, "repo.url")) + ctx.repo = cgit_add_repo(value); + else if (!strcmp(name, "repo.name")) + 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 == '/') + ctx.repo->readme = xstrdup(value); + else + ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value)); + } else if (!strcmp(name, "include")) + cgit_read_config(value, config_cb); +} + +static void querystring_cb(const char *name, const char *value) +{ + if (!strcmp(name,"r")) { + ctx.qry.repo = xstrdup(value); + ctx.repo = cgit_get_repoinfo(value); + } else if (!strcmp(name, "p")) { + ctx.qry.page = xstrdup(value); + } else if (!strcmp(name, "url")) { + cgit_parse_url(value); + } else if (!strcmp(name, "qt")) { + ctx.qry.grep = xstrdup(value); + } else if (!strcmp(name, "q")) { + ctx.qry.search = xstrdup(value); + } else if (!strcmp(name, "h")) { + ctx.qry.head = xstrdup(value); + ctx.qry.has_symref = 1; + } else if (!strcmp(name, "id")) { + ctx.qry.sha1 = xstrdup(value); + ctx.qry.has_sha1 = 1; + } else if (!strcmp(name, "id2")) { + ctx.qry.sha2 = xstrdup(value); + ctx.qry.has_sha1 = 1; + } else if (!strcmp(name, "ofs")) { + ctx.qry.ofs = atoi(value); + } else if (!strcmp(name, "path")) { + ctx.qry.path = trim_end(value, '/'); + } else if (!strcmp(name, "name")) { + ctx.qry.name = xstrdup(value); + } +} + +static void 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; + ctx->page.mimetype = "text/html"; + ctx->page.charset = PAGE_ENCODING; + ctx->page.filename = NULL; +} + static int cgit_prepare_cache(struct cacheitem *item) { if (!ctx.repo && ctx.qry.repo) { @@ -277,20 +427,20 @@ int main(int argc, const char **argv) struct cacheitem item; const char *cgit_config_env = getenv("CGIT_CONFIG"); - cgit_prepare_context(&ctx); + prepare_context(&ctx); item.st.st_mtime = time(NULL); cgit_repolist.length = 0; cgit_repolist.count = 0; cgit_repolist.repos = NULL; cgit_read_config(cgit_config_env ? cgit_config_env : CGIT_CONFIG, - cgit_global_config_cb); + config_cb); if (getenv("SCRIPT_NAME")) ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); if (getenv("QUERY_STRING")) ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); cgit_parse_args(argc, argv); - cgit_parse_query(ctx.qry.raw, cgit_querystring_cb); + cgit_parse_query(ctx.qry.raw, querystring_cb); if (!cgit_prepare_cache(&item)) return 0; if (ctx.cfg.nocache) { diff --git a/cgit.h b/cgit.h index c1a231d..b58676b 100644 --- a/cgit.h +++ b/cgit.h @@ -191,11 +191,9 @@ 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); +extern struct cgit_repo *cgit_add_repo(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); extern int chk_zero(int result, char *msg); extern int chk_positive(int result, char *msg); diff --git a/shared.c b/shared.c index 800c06a..cd60da5 100644 --- a/shared.c +++ b/shared.c @@ -14,32 +14,6 @@ int cgit_cmd; const char *cgit_version = CGIT_VERSION; -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; - ctx->page.mimetype = "text/html"; - ctx->page.charset = PAGE_ENCODING; - ctx->page.filename = NULL; -} - int chk_zero(int result, char *msg) { if (result != 0) @@ -61,7 +35,7 @@ int chk_non_negative(int result, char *msg) return result; } -struct cgit_repo *add_repo(const char *url) +struct cgit_repo *cgit_add_repo(const char *url) { struct cgit_repo *ret; @@ -104,130 +78,6 @@ struct cgit_repo *cgit_get_repoinfo(const char *url) return NULL; } -void cgit_global_config_cb(const char *name, const char *value) -{ - if (!strcmp(name, "root-title")) - ctx.cfg.root_title = xstrdup(value); - else if (!strcmp(name, "css")) - ctx.cfg.css = xstrdup(value); - else if (!strcmp(name, "logo")) - ctx.cfg.logo = xstrdup(value); - else if (!strcmp(name, "index-header")) - ctx.cfg.index_header = xstrdup(value); - else if (!strcmp(name, "index-info")) - ctx.cfg.index_info = xstrdup(value); - else if (!strcmp(name, "logo-link")) - ctx.cfg.logo_link = xstrdup(value); - else if (!strcmp(name, "module-link")) - ctx.cfg.module_link = xstrdup(value); - else if (!strcmp(name, "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")) - ctx.cfg.nocache = atoi(value); - else if (!strcmp(name, "snapshots")) - ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); - else if (!strcmp(name, "enable-index-links")) - ctx.cfg.enable_index_links = atoi(value); - else if (!strcmp(name, "enable-log-filecount")) - ctx.cfg.enable_log_filecount = atoi(value); - else if (!strcmp(name, "enable-log-linecount")) - ctx.cfg.enable_log_linecount = atoi(value); - else if (!strcmp(name, "cache-root")) - ctx.cfg.cache_root = xstrdup(value); - else if (!strcmp(name, "cache-root-ttl")) - ctx.cfg.cache_root_ttl = atoi(value); - else if (!strcmp(name, "cache-repo-ttl")) - ctx.cfg.cache_repo_ttl = atoi(value); - else if (!strcmp(name, "cache-static-ttl")) - ctx.cfg.cache_static_ttl = atoi(value); - else if (!strcmp(name, "cache-dynamic-ttl")) - ctx.cfg.cache_dynamic_ttl = atoi(value); - else if (!strcmp(name, "max-message-length")) - ctx.cfg.max_msg_len = atoi(value); - else if (!strcmp(name, "max-repodesc-length")) - ctx.cfg.max_repodesc_len = atoi(value); - else if (!strcmp(name, "max-commit-count")) - ctx.cfg.max_commit_count = atoi(value); - else if (!strcmp(name, "summary-log")) - ctx.cfg.summary_log = atoi(value); - else if (!strcmp(name, "summary-branches")) - ctx.cfg.summary_branches = atoi(value); - else if (!strcmp(name, "summary-tags")) - ctx.cfg.summary_tags = atoi(value); - else if (!strcmp(name, "agefile")) - ctx.cfg.agefile = xstrdup(value); - else if (!strcmp(name, "renamelimit")) - ctx.cfg.renamelimit = atoi(value); - else if (!strcmp(name, "robots")) - ctx.cfg.robots = xstrdup(value); - else if (!strcmp(name, "clone-prefix")) - ctx.cfg.clone_prefix = xstrdup(value); - else if (!strcmp(name, "repo.group")) - ctx.cfg.repo_group = xstrdup(value); - else if (!strcmp(name, "repo.url")) - ctx.repo = add_repo(value); - else if (!strcmp(name, "repo.name")) - 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 == '/') - ctx.repo->readme = xstrdup(value); - else - ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value)); - } else if (!strcmp(name, "include")) - cgit_read_config(value, cgit_global_config_cb); -} - -void cgit_querystring_cb(const char *name, const char *value) -{ - if (!strcmp(name,"r")) { - ctx.qry.repo = xstrdup(value); - ctx.repo = cgit_get_repoinfo(value); - } else if (!strcmp(name, "p")) { - ctx.qry.page = xstrdup(value); - } else if (!strcmp(name, "url")) { - cgit_parse_url(value); - } else if (!strcmp(name, "qt")) { - ctx.qry.grep = xstrdup(value); - } else if (!strcmp(name, "q")) { - ctx.qry.search = xstrdup(value); - } else if (!strcmp(name, "h")) { - ctx.qry.head = xstrdup(value); - ctx.qry.has_symref = 1; - } else if (!strcmp(name, "id")) { - ctx.qry.sha1 = xstrdup(value); - ctx.qry.has_sha1 = 1; - } else if (!strcmp(name, "id2")) { - ctx.qry.sha2 = xstrdup(value); - ctx.qry.has_sha1 = 1; - } else if (!strcmp(name, "ofs")) { - ctx.qry.ofs = atoi(value); - } else if (!strcmp(name, "path")) { - ctx.qry.path = trim_end(value, '/'); - } else if (!strcmp(name, "name")) { - ctx.qry.name = xstrdup(value); - } -} - void *cgit_free_commitinfo(struct commitinfo *info) { free(info->author); -- cgit v1.2.3-54-g00ecf From dc3282f0baa14949439593729a45fbe143e3622c Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Tue, 25 Mar 2008 02:00:09 +0100 Subject: Remove global and obsolete cgit_cmd This variable was obsoleted by cmd.c. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.c | 2 +- cgit.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index 3943a0f..f749b6b 100644 --- a/cgit.c +++ b/cgit.c @@ -181,7 +181,7 @@ static int cgit_prepare_cache(struct cacheitem *item) return 1; } - if (!cgit_cmd) { + if (!ctx.qry.page) { item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root, cache_safe_filename(ctx.repo->url), cache_safe_filename(ctx.qry.raw))); diff --git a/cgit.h b/cgit.h index b58676b..e82e9aa 100644 --- a/cgit.h +++ b/cgit.h @@ -189,7 +189,6 @@ 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 struct cgit_repo *cgit_add_repo(const char *url); extern struct cgit_repo *cgit_get_repoinfo(const char *url); -- cgit v1.2.3-54-g00ecf From ee4056bd2c902a12dea67874368863fe60ea5a5f Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Thu, 27 Mar 2008 09:22:13 +0100 Subject: Add cache.h The functions found in cache.c are only used by cgit.c, so there's no point in rebuilding all object files when the cache interface is changed. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cache.c | 1 + cache.h | 23 +++++++++++++++++++++++ cgit.c | 1 + cgit.h | 14 -------------- 4 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 cache.h (limited to 'cgit.h') diff --git a/cache.c b/cache.c index 7860fc7..89f7ecd 100644 --- a/cache.c +++ b/cache.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "cache.h" const int NOLOCK = -1; diff --git a/cache.h b/cache.h new file mode 100644 index 0000000..4dcbea3 --- /dev/null +++ b/cache.h @@ -0,0 +1,23 @@ +/* + * Since git has it's own cache.h which we include, + * lets test on CGIT_CACHE_H to avoid confusion + */ + +#ifndef CGIT_CACHE_H +#define CGIT_CACHE_H + +struct cacheitem { + char *name; + struct stat st; + int ttl; + int fd; +}; + +extern char *cache_safe_filename(const char *unsafe); +extern int cache_lock(struct cacheitem *item); +extern int cache_unlock(struct cacheitem *item); +extern int cache_cancel_lock(struct cacheitem *item); +extern int cache_exist(struct cacheitem *item); +extern int cache_expired(struct cacheitem *item); + +#endif /* CGIT_CACHE_H */ diff --git a/cgit.c b/cgit.c index f749b6b..73b1f02 100644 --- a/cgit.c +++ b/cgit.c @@ -7,6 +7,7 @@ */ #include "cgit.h" +#include "cache.h" #include "cmd.h" #include "ui-shared.h" diff --git a/cgit.h b/cgit.h index e82e9aa..f600912 100644 --- a/cgit.h +++ b/cgit.h @@ -46,13 +46,6 @@ typedef void (*configfn)(const char *name, const char *value); typedef void (*filepair_fn)(struct diff_filepair *pair); typedef void (*linediff_fn)(char *line, int len); -struct cacheitem { - char *name; - struct stat st; - int ttl; - int fd; -}; - struct cgit_repo { char *url; char *name; @@ -227,13 +220,6 @@ extern struct commitinfo *cgit_parse_commit(struct commit *commit); extern struct taginfo *cgit_parse_tag(struct tag *tag); extern void cgit_parse_url(const char *url); -extern char *cache_safe_filename(const char *unsafe); -extern int cache_lock(struct cacheitem *item); -extern int cache_unlock(struct cacheitem *item); -extern int cache_cancel_lock(struct cacheitem *item); -extern int cache_exist(struct cacheitem *item); -extern int cache_expired(struct cacheitem *item); - extern const char *cgit_repobasename(const char *reponame); extern int cgit_parse_snapshots_mask(const char *str); -- cgit v1.2.3-54-g00ecf From 20a33548b9a87a6eb23162ee5d137daa46d78613 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Fri, 28 Mar 2008 00:09:11 +0100 Subject: Move function for configfile parsing into configfile.[ch] This is a generic function which wanted its own little object file. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- Makefile | 1 + cgit.c | 5 ++-- cgit.h | 1 - configfile.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configfile.h | 8 ++++++ parsing.c | 75 --------------------------------------------------- 6 files changed, 99 insertions(+), 78 deletions(-) create mode 100644 configfile.c create mode 100644 configfile.h (limited to 'cgit.h') diff --git a/Makefile b/Makefile index 223765d..355186e 100644 --- a/Makefile +++ b/Makefile @@ -51,6 +51,7 @@ OBJECTS = OBJECTS += cache.o OBJECTS += cgit.o OBJECTS += cmd.o +OBJECTS += configfile.o OBJECTS += html.o OBJECTS += parsing.o OBJECTS += shared.o diff --git a/cgit.c b/cgit.c index 73b1f02..1f46e0d 100644 --- a/cgit.c +++ b/cgit.c @@ -9,6 +9,7 @@ #include "cgit.h" #include "cache.h" #include "cmd.h" +#include "configfile.h" #include "ui-shared.h" const char *cgit_version = CGIT_VERSION; @@ -103,7 +104,7 @@ void config_cb(const char *name, const char *value) else ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value)); } else if (!strcmp(name, "include")) - cgit_read_config(value, config_cb); + parse_configfile(value, config_cb); } static void querystring_cb(const char *name, const char *value) @@ -436,7 +437,7 @@ int main(int argc, const char **argv) cgit_repolist.count = 0; cgit_repolist.repos = NULL; - cgit_read_config(cgit_config_env ? cgit_config_env : CGIT_CONFIG, + parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG, config_cb); if (getenv("SCRIPT_NAME")) ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); diff --git a/cgit.h b/cgit.h index f600912..91d18f8 100644 --- a/cgit.h +++ b/cgit.h @@ -214,7 +214,6 @@ extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); extern char *fmt(const char *format,...); -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); extern struct taginfo *cgit_parse_tag(struct tag *tag); diff --git a/configfile.c b/configfile.c new file mode 100644 index 0000000..4908058 --- /dev/null +++ b/configfile.c @@ -0,0 +1,87 @@ +/* configfile.c: parsing of config files + * + * Copyright (C) 2008 Lars Hjemli + * + * Licensed under GNU General Public License v2 + * (see COPYING for full license text) + */ + +#include <ctype.h> +#include <stdio.h> +#include "configfile.h" + +int next_char(FILE *f) +{ + int c = fgetc(f); + if (c=='\r') { + c = fgetc(f); + if (c!='\n') { + ungetc(c, f); + c = '\r'; + } + } + return c; +} + +void skip_line(FILE *f) +{ + int c; + + while((c=next_char(f)) && c!='\n' && c!=EOF) + ; +} + +int read_config_line(FILE *f, char *line, const char **value, int bufsize) +{ + int i = 0, isname = 0; + + *value = NULL; + while(i<bufsize-1) { + int c = next_char(f); + if (!isname && (c=='#' || c==';')) { + skip_line(f); + continue; + } + if (!isname && isspace(c)) + continue; + + if (c=='=' && !*value) { + line[i] = 0; + *value = &line[i+1]; + } else if (c=='\n' && !isname) { + i = 0; + continue; + } else if (c=='\n' || c==EOF) { + line[i] = 0; + break; + } else { + line[i]=c; + } + isname = 1; + i++; + } + line[i+1] = 0; + return i; +} + +int parse_configfile(const char *filename, configfile_value_fn fn) +{ + static int nesting; + int len; + char line[256]; + const char *value; + FILE *f; + + /* cancel deeply nested include-commands */ + if (nesting > 8) + return -1; + if (!(f = fopen(filename, "r"))) + return -1; + nesting++; + while((len = read_config_line(f, line, &value, sizeof(line))) > 0) + fn(line, value); + nesting--; + fclose(f); + return 0; +} + diff --git a/configfile.h b/configfile.h new file mode 100644 index 0000000..04235e5 --- /dev/null +++ b/configfile.h @@ -0,0 +1,8 @@ +#ifndef CONFIGFILE_H +#define CONFIGFILE_H + +typedef void (*configfile_value_fn)(const char *name, const char *value); + +extern int parse_configfile(const char *filename, configfile_value_fn fn); + +#endif /* CONFIGFILE_H */ diff --git a/parsing.c b/parsing.c index 8dce488..9a4a7a3 100644 --- a/parsing.c +++ b/parsing.c @@ -8,81 +8,6 @@ #include "cgit.h" -int next_char(FILE *f) -{ - int c = fgetc(f); - if (c=='\r') { - c = fgetc(f); - if (c!='\n') { - ungetc(c, f); - c = '\r'; - } - } - return c; -} - -void skip_line(FILE *f) -{ - int c; - - while((c=next_char(f)) && c!='\n' && c!=EOF) - ; -} - -int read_config_line(FILE *f, char *line, const char **value, int bufsize) -{ - int i = 0, isname = 0; - - *value = NULL; - while(i<bufsize-1) { - int c = next_char(f); - if (!isname && (c=='#' || c==';')) { - skip_line(f); - continue; - } - if (!isname && isspace(c)) - continue; - - if (c=='=' && !*value) { - line[i] = 0; - *value = &line[i+1]; - } else if (c=='\n' && !isname) { - i = 0; - continue; - } else if (c=='\n' || c==EOF) { - line[i] = 0; - break; - } else { - line[i]=c; - } - isname = 1; - i++; - } - line[i+1] = 0; - return i; -} - -int cgit_read_config(const char *filename, configfn fn) -{ - static int nesting; - int len; - char line[256]; - const char *value; - FILE *f; - - /* cancel deeply nested include-commands */ - if (nesting > 8) - return -1; - if (!(f = fopen(filename, "r"))) - return -1; - nesting++; - while((len = read_config_line(f, line, &value, sizeof(line))) > 0) - (*fn)(line, value); - nesting--; - fclose(f); - return 0; -} - char *convert_query_hexchar(char *txt) { int d1, d2; -- cgit v1.2.3-54-g00ecf From e87e89633383b8b75c68c98be3e0c14212109de2 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Tue, 8 Apr 2008 21:11:36 +0200 Subject: Move cgit_parse_query() from parsing.c to html.c as http_parse_querystring() This is a generic http-function. Signed-off-by: Lars Hjemli <hjemli@gmail.com> --- cgit.c | 3 ++- cgit.h | 2 -- html.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ html.h | 2 ++ parsing.c | 49 ------------------------------------------------ shared.c | 12 ------------ 6 files changed, 68 insertions(+), 64 deletions(-) (limited to 'cgit.h') diff --git a/cgit.c b/cgit.c index 1f46e0d..763242a 100644 --- a/cgit.c +++ b/cgit.c @@ -10,6 +10,7 @@ #include "cache.h" #include "cmd.h" #include "configfile.h" +#include "html.h" #include "ui-shared.h" const char *cgit_version = CGIT_VERSION; @@ -444,7 +445,7 @@ int main(int argc, const char **argv) if (getenv("QUERY_STRING")) ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); cgit_parse_args(argc, argv); - cgit_parse_query(ctx.qry.raw, querystring_cb); + http_parse_querystring(ctx.qry.raw, querystring_cb); if (!cgit_prepare_cache(&item)) return 0; if (ctx.cfg.nocache) { diff --git a/cgit.h b/cgit.h index 91d18f8..ee8c716 100644 --- a/cgit.h +++ b/cgit.h @@ -191,7 +191,6 @@ extern int chk_zero(int result, char *msg); extern int chk_positive(int result, char *msg); extern int chk_non_negative(int result, char *msg); -extern int hextoint(char c); extern char *trim_end(const char *str, char c); extern char *strlpart(char *txt, int maxlen); extern char *strrpart(char *txt, int maxlen); @@ -214,7 +213,6 @@ extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); extern char *fmt(const char *format,...); -extern int cgit_parse_query(char *txt, configfn fn); extern struct commitinfo *cgit_parse_commit(struct commit *commit); extern struct taginfo *cgit_parse_tag(struct tag *tag); extern void cgit_parse_url(const char *url); diff --git a/html.c b/html.c index 0962e71..98ffaf9 100644 --- a/html.c +++ b/html.c @@ -185,3 +185,67 @@ int html_include(const char *filename) fclose(f); return 0; } + +int hextoint(char c) +{ + if (c >= 'a' && c <= 'f') + return 10 + c - 'a'; + else if (c >= 'A' && c <= 'F') + return 10 + c - 'A'; + else if (c >= '0' && c <= '9') + return c - '0'; + else + return -1; +} + +char *convert_query_hexchar(char *txt) +{ + int d1, d2; + if (strlen(txt) < 3) { + *txt = '\0'; + return txt-1; + } + d1 = hextoint(*(txt+1)); + d2 = hextoint(*(txt+2)); + if (d1<0 || d2<0) { + strcpy(txt, txt+3); + return txt-1; + } else { + *txt = d1 * 16 + d2; + strcpy(txt+1, txt+3); + return txt; + } +} + +int http_parse_querystring(char *txt, void (*fn)(const char *name, const char *value)) +{ + char *t, *value = NULL, c; + + if (!txt) + return 0; + + t = txt = strdup(txt); + if (t == NULL) { + printf("Out of memory\n"); + exit(1); + } + while((c=*t) != '\0') { + if (c=='=') { + *t = '\0'; + value = t+1; + } else if (c=='+') { + *t = ' '; + } else if (c=='%') { + t = convert_query_hexchar(t); + } else if (c=='&') { + *t = '\0'; + (*fn)(txt, value); + txt = t+1; + value = NULL; + } + t++; + } + if (t!=txt) + (*fn)(txt, value); + return 0; +} diff --git a/html.h b/html.h index 63f4551..e6fdc54 100644 --- a/html.h +++ b/html.h @@ -15,4 +15,6 @@ extern void html_link_close(void); extern void html_fileperm(unsigned short mode); extern int html_include(const char *filename); +extern int http_parse_querystring(char *txt, void (*fn)(const char *name, const char *value)); + #endif /* HTML_H */ diff --git a/parsing.c b/parsing.c index 9a4a7a3..66e8b3d 100644 --- a/parsing.c +++ b/parsing.c @@ -8,55 +8,6 @@ #include "cgit.h" -char *convert_query_hexchar(char *txt) -{ - int d1, d2; - if (strlen(txt) < 3) { - *txt = '\0'; - return txt-1; - } - d1 = hextoint(*(txt+1)); - d2 = hextoint(*(txt+2)); - if (d1<0 || d2<0) { - strcpy(txt, txt+3); - return txt-1; - } else { - *txt = d1 * 16 + d2; - strcpy(txt+1, txt+3); - return txt; - } -} - -int cgit_parse_query(char *txt, configfn fn) -{ - char *t, *value = NULL, c; - - if (!txt) - return 0; - - t = txt = xstrdup(txt); - - while((c=*t) != '\0') { - if (c=='=') { - *t = '\0'; - value = t+1; - } else if (c=='+') { - *t = ' '; - } else if (c=='%') { - t = convert_query_hexchar(t); - } else if (c=='&') { - *t = '\0'; - (*fn)(txt, value); - txt = t+1; - value = NULL; - } - t++; - } - if (t!=txt) - (*fn)(txt, value); - return 0; -} - /* * url syntax: [repo ['/' cmd [ '/' path]]] * repo: any valid repo url, may contain '/' diff --git a/shared.c b/shared.c index 48002ac..f5875e4 100644 --- a/shared.c +++ b/shared.c @@ -89,18 +89,6 @@ void *cgit_free_commitinfo(struct commitinfo *info) return NULL; } -int hextoint(char c) -{ - if (c >= 'a' && c <= 'f') - return 10 + c - 'a'; - else if (c >= 'A' && c <= 'F') - return 10 + c - 'A'; - else if (c >= '0' && c <= '9') - return c - '0'; - else - return -1; -} - char *trim_end(const char *str, char c) { int len; -- cgit v1.2.3-54-g00ecf