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 --- parsing.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'parsing.c') diff --git a/parsing.c b/parsing.c index 5093b8b..8cf56a4 100644 --- a/parsing.c +++ b/parsing.c @@ -149,7 +149,7 @@ void cgit_parse_url(const char *url) cgit_repo = cgit_get_repoinfo(url); if (cgit_repo) { - cgit_query_repo = cgit_repo->url; + ctx.qry.repo = cgit_repo->url; return; } @@ -163,15 +163,15 @@ void cgit_parse_url(const char *url) continue; } - cgit_query_repo = cgit_repo->url; + ctx.qry.repo = cgit_repo->url; p = strchr(cmd + 1, '/'); if (p) { p[0] = '\0'; if (p[1]) - cgit_query_path = trim_end(p + 1, '/'); + ctx.qry.path = trim_end(p + 1, '/'); } cgit_cmd = cgit_get_cmd_index(cmd + 1); - cgit_query_page = xstrdup(cmd + 1); + ctx.qry.page = xstrdup(cmd + 1); return; } } -- 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 --- 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 'parsing.c') diff --git a/cache.c b/cache.c index 2ed0d6f..7860fc7 100644 --- a/cache.c +++ b/cache.c @@ -48,18 +48,18 @@ int cache_create_dirs() if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; - if (!cgit_repo) + if (!ctx.repo) return 0; path = fmt("%s/%s", ctx.cfg.cache_root, - cache_safe_filename(cgit_repo->url)); + cache_safe_filename(ctx.repo->url)); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; if (ctx.qry.page) { path = fmt("%s/%s/%s", ctx.cfg.cache_root, - cache_safe_filename(cgit_repo->url), + cache_safe_filename(ctx.repo->url), ctx.qry.page); if (mkdir(path, S_IRWXU) && errno!=EEXIST) return 0; diff --git a/cgit.c b/cgit.c index f0907a1..b270fdc 100644 --- a/cgit.c +++ b/cgit.c @@ -10,7 +10,7 @@ static int cgit_prepare_cache(struct cacheitem *item) { - if (!cgit_repo && ctx.qry.repo) { + if (!ctx.repo && ctx.qry.repo) { char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); @@ -19,7 +19,7 @@ static int cgit_prepare_cache(struct cacheitem *item) return 0; } - if (!cgit_repo) { + if (!ctx.repo) { item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root)); item->ttl = ctx.cfg.cache_root_ttl; return 1; @@ -27,12 +27,12 @@ static int cgit_prepare_cache(struct cacheitem *item) if (!cgit_cmd) { item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root, - cache_safe_filename(cgit_repo->url), + cache_safe_filename(ctx.repo->url), cache_safe_filename(ctx.qry.raw))); item->ttl = ctx.cfg.cache_repo_ttl; } else { item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root, - cache_safe_filename(cgit_repo->url), + cache_safe_filename(ctx.repo->url), ctx.qry.page, cache_safe_filename(ctx.qry.raw))); if (ctx.qry.has_symref) @@ -64,7 +64,7 @@ int find_current_ref(const char *refname, const unsigned char *sha1, return info->match; } -char *find_default_branch(struct repoinfo *repo) +char *find_default_branch(struct cgit_repo *repo) { struct refmatch info; @@ -84,7 +84,7 @@ static void cgit_print_repo_page(struct cacheitem *item) int show_search; unsigned char sha1[20]; - if (chdir(cgit_repo->path)) { + if (chdir(ctx.repo->path)) { title = fmt("%s - %s", ctx.cfg.root_title, "Bad request"); cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); @@ -94,13 +94,13 @@ static void cgit_print_repo_page(struct cacheitem *item) return; } - title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc); + title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc); show_search = 0; - setenv("GIT_DIR", cgit_repo->path, 1); + setenv("GIT_DIR", ctx.repo->path, 1); if (!ctx.qry.head) { - ctx.qry.head = xstrdup(find_default_branch(cgit_repo)); - cgit_repo->defbranch = ctx.qry.head; + ctx.qry.head = xstrdup(find_default_branch(ctx.repo)); + ctx.repo->defbranch = ctx.qry.head; } if (!ctx.qry.head) { @@ -113,7 +113,7 @@ static void cgit_print_repo_page(struct cacheitem *item) if (get_sha1(ctx.qry.head, sha1)) { tmp = xstrdup(ctx.qry.head); - ctx.qry.head = cgit_repo->defbranch; + ctx.qry.head = ctx.repo->defbranch; cgit_print_docstart(title, item); cgit_print_pageheader(title, 0); cgit_print_error(fmt("Invalid branch: %s", tmp)); @@ -121,11 +121,11 @@ static void cgit_print_repo_page(struct cacheitem *item) return; } - if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) { + if ((cgit_cmd == CMD_SNAPSHOT) && ctx.repo->snapshots) { cgit_print_snapshot(item, ctx.qry.head, ctx.qry.sha1, - cgit_repobasename(cgit_repo->url), + cgit_repobasename(ctx.repo->url), ctx.qry.path, - cgit_repo->snapshots ); + ctx.repo->snapshots ); return; } @@ -192,7 +192,7 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache) chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)"); } - if (cgit_repo) + if (ctx.repo) cgit_print_repo_page(item); else cgit_print_repolist(item); @@ -300,7 +300,6 @@ int main(int argc, const char **argv) cgit_read_config(cgit_config_env ? cgit_config_env : CGIT_CONFIG, cgit_global_config_cb); - cgit_repo = NULL; if (getenv("SCRIPT_NAME")) ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); if (getenv("QUERY_STRING")) diff --git a/cgit.h b/cgit.h index 0338ebd..598d8c3 100644 --- a/cgit.h +++ b/cgit.h @@ -66,7 +66,7 @@ struct cacheitem { int fd; }; -struct repoinfo { +struct cgit_repo { char *url; char *name; char *path; @@ -82,10 +82,10 @@ struct repoinfo { int enable_log_linecount; }; -struct repolist { +struct cgit_repolist { int length; int count; - struct repoinfo *repos; + struct cgit_repo *repos; }; struct commitinfo { @@ -177,12 +177,12 @@ struct cgit_config { struct cgit_context { struct cgit_query qry; struct cgit_config cfg; + struct cgit_repo *repo; }; extern const char *cgit_version; -extern struct repolist cgit_repolist; -extern struct repoinfo *cgit_repo; +extern struct cgit_repolist cgit_repolist; extern struct cgit_context ctx; extern int cgit_cmd; @@ -190,7 +190,7 @@ extern int htmlfd; extern void cgit_prepare_context(struct cgit_context *ctx); extern int cgit_get_cmd_index(const char *cmd); -extern struct repoinfo *cgit_get_repoinfo(const char *url); +extern struct cgit_repo *cgit_get_repoinfo(const char *url); extern void cgit_global_config_cb(const char *name, const char *value); extern void cgit_repo_config_cb(const char *name, const char *value); extern void cgit_querystring_cb(const char *name, const char *value); diff --git a/parsing.c b/parsing.c index 8cf56a4..027f06b 100644 --- a/parsing.c +++ b/parsing.c @@ -143,27 +143,27 @@ void cgit_parse_url(const char *url) { char *cmd, *p; - cgit_repo = NULL; + ctx.repo = NULL; if (!url || url[0] == '\0') return; - cgit_repo = cgit_get_repoinfo(url); - if (cgit_repo) { - ctx.qry.repo = cgit_repo->url; + ctx.repo = cgit_get_repoinfo(url); + if (ctx.repo) { + ctx.qry.repo = ctx.repo->url; return; } cmd = strchr(url, '/'); - while (!cgit_repo && cmd) { + while (!ctx.repo && cmd) { cmd[0] = '\0'; - cgit_repo = cgit_get_repoinfo(url); - if (cgit_repo == NULL) { + ctx.repo = cgit_get_repoinfo(url); + if (ctx.repo == NULL) { cmd[0] = '/'; cmd = strchr(cmd + 1, '/'); continue; } - ctx.qry.repo = cgit_repo->url; + ctx.qry.repo = ctx.repo->url; p = strchr(cmd + 1, '/'); if (p) { p[0] = '\0'; diff --git a/shared.c b/shared.c index 8dd2b00..808e674 100644 --- a/shared.c +++ b/shared.c @@ -8,8 +8,7 @@ #include "cgit.h" -struct repolist cgit_repolist; -struct repoinfo *cgit_repo; +struct cgit_repolist cgit_repolist; struct cgit_context ctx; int cgit_cmd; @@ -73,9 +72,9 @@ int chk_non_negative(int result, char *msg) return result; } -struct repoinfo *add_repo(const char *url) +struct cgit_repo *add_repo(const char *url) { - struct repoinfo *ret; + struct cgit_repo *ret; if (++cgit_repolist.count > cgit_repolist.length) { if (cgit_repolist.length == 0) @@ -84,7 +83,7 @@ struct repoinfo *add_repo(const char *url) cgit_repolist.length *= 2; cgit_repolist.repos = xrealloc(cgit_repolist.repos, cgit_repolist.length * - sizeof(struct repoinfo)); + sizeof(struct cgit_repo)); } ret = &cgit_repolist.repos[cgit_repolist.count-1]; @@ -103,10 +102,10 @@ struct repoinfo *add_repo(const char *url) return ret; } -struct repoinfo *cgit_get_repoinfo(const char *url) +struct cgit_repo *cgit_get_repoinfo(const char *url) { int i; - struct repoinfo *repo; + struct cgit_repo *repo; for (i=0; iname = 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(")"); } - if (cgit_repo->snapshots) { + if (ctx.repo->snapshots) { html("download"); cgit_print_snapshot_links(ctx.qry.repo, ctx.qry.head, - hex, cgit_repo->snapshots); + hex, ctx.repo->snapshots); html(""); } html("\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(""); cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, sha1_to_hex(commit->object.sha1)); - if (cgit_repo->enable_log_filecount) { + if (ctx.repo->enable_log_filecount) { files = 0; add_lines = 0; rem_lines = 0; cgit_diff_commit(commit, inspect_files); html(""); htmlf("%d", files); - if (cgit_repo->enable_log_linecount) { + if (ctx.repo->enable_log_linecount) { html(""); htmlf("-%d/+%d", rem_lines, add_lines); } @@ -94,9 +94,9 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern html("Age" "Message"); - if (cgit_repo->enable_log_filecount) { + if (ctx.repo->enable_log_filecount) { html("Files"); - if (cgit_repo->enable_log_linecount) + if (ctx.repo->enable_log_linecount) html("Lines"); } html("Author\n"); diff --git a/ui-repolist.c b/ui-repolist.c index a6cc2cc..5fde174 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -25,7 +25,7 @@ time_t read_agefile(char *path) return 0; } -static void print_modtime(struct repoinfo *repo) +static void print_modtime(struct cgit_repo *repo) { char *path; struct stat s; @@ -70,32 +70,32 @@ void cgit_print_repolist(struct cacheitem *item) html("\n"); for (i=0; igroup != NULL) || - (last_group != NULL && cgit_repo->group == NULL) || - (last_group != NULL && cgit_repo->group != NULL && - strcmp(cgit_repo->group, last_group))) { + ctx.repo = &cgit_repolist.repos[i]; + if ((last_group == NULL && ctx.repo->group != NULL) || + (last_group != NULL && ctx.repo->group == NULL) || + (last_group != NULL && ctx.repo->group != NULL && + strcmp(ctx.repo->group, last_group))) { htmlf("", columns); - html_txt(cgit_repo->group); + html_txt(ctx.repo->group); html(""); - last_group = cgit_repo->group; + last_group = ctx.repo->group; } htmlf("", - cgit_repo->group ? "sublevel-repo" : "toplevel-repo"); - html_link_open(cgit_repourl(cgit_repo->url), NULL, NULL); - html_txt(cgit_repo->name); + ctx.repo->group ? "sublevel-repo" : "toplevel-repo"); + html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL); + html_txt(ctx.repo->name); html_link_close(); html(""); - html_ntxt(ctx.cfg.max_repodesc_len, cgit_repo->desc); + html_ntxt(ctx.cfg.max_repodesc_len, ctx.repo->desc); html(""); - html_txt(cgit_repo->owner); + html_txt(ctx.repo->owner); html(""); - print_modtime(cgit_repo); + print_modtime(ctx.repo); html(""); if (ctx.cfg.enable_index_links) { html(""); - html_link_open(cgit_repourl(cgit_repo->url), + html_link_open(cgit_repourl(ctx.repo->url), NULL, "button"); html("summary"); cgit_log_link("log", NULL, "button", NULL, NULL, NULL, diff --git a/ui-shared.c b/ui-shared.c index b96237d..b9f487a 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -141,8 +141,8 @@ static char *repolink(char *title, char *class, char *page, char *head, html_attr(ctx.cfg.virtual_root); if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') html("/"); - html_attr(cgit_repo->url); - if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') + html_attr(ctx.repo->url); + if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') html("/"); if (page) { html(page); @@ -153,8 +153,8 @@ static char *repolink(char *title, char *class, char *page, char *head, } else { html(ctx.cfg.script_name); html("?url="); - html_attr(cgit_repo->url); - if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') + html_attr(ctx.repo->url); + if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') html("/"); if (page) { html(page); @@ -164,7 +164,7 @@ static char *repolink(char *title, char *class, char *page, char *head, } delim = "&"; } - if (head && strcmp(head, cgit_repo->defbranch)) { + if (head && strcmp(head, ctx.repo->defbranch)) { html(delim); html("h="); html_attr(head); @@ -446,7 +446,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page) html_hidden("url", url); } - if (incl_head && strcmp(ctx.qry.head, cgit_repo->defbranch)) + if (incl_head && strcmp(ctx.qry.head, ctx.repo->defbranch)) html_hidden("h", ctx.qry.head); if (ctx.qry.sha1) @@ -478,12 +478,12 @@ void cgit_print_pageheader(char *title, int show_search) html("\n\n"); if (ctx.qry.repo) { html("

"); - html_txt(strrpart(cgit_repo->name, 20)); + html_txt(strrpart(ctx.repo->name, 20)); html("

\n"); - html_txt(cgit_repo->desc); - if (cgit_repo->owner) { + html_txt(ctx.repo->desc); + if (ctx.repo->owner) { html("

owner

\n"); - html_txt(cgit_repo->owner); + html_txt(ctx.repo->owner); } html("

navigate

\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("

clone

\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(""); - html_include(cgit_repo->readme); + html_include(ctx.repo->readme); html(""); } 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(""); if (S_ISGITLINK(mode)) { htmlf(""); -- 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 --- 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 'parsing.c') 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 -/* - * 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 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 --- 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 'parsing.c') 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 +#include +#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 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 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 --- 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 'parsing.c') 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