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.c | 72 +++++++++++++++++++++++++++++++++---------------------------------
 1 file changed, 36 insertions(+), 36 deletions(-)

(limited to 'cgit.c')

diff --git a/cgit.c b/cgit.c
index e8acc03..8a30c3c 100644
--- a/cgit.c
+++ b/cgit.c
@@ -10,11 +10,11 @@
 
 static int cgit_prepare_cache(struct cacheitem *item)
 {
-	if (!cgit_repo && cgit_query_repo) {
+	if (!cgit_repo && ctx.qry.repo) {
 		char *title = fmt("%s - %s", cgit_root_title, "Bad request");
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
-		cgit_print_error(fmt("Unknown repo: %s", cgit_query_repo));
+		cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo));
 		cgit_print_docend();
 		return 0;
 	}
@@ -28,16 +28,16 @@ static int cgit_prepare_cache(struct cacheitem *item)
 	if (!cgit_cmd) {
 		item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root,
 					 cache_safe_filename(cgit_repo->url),
-					 cache_safe_filename(cgit_querystring)));
+					 cache_safe_filename(ctx.qry.raw)));
 		item->ttl = cgit_cache_repo_ttl;
 	} else {
 		item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root,
 					 cache_safe_filename(cgit_repo->url),
-					 cgit_query_page,
-					 cache_safe_filename(cgit_querystring)));
-		if (cgit_query_has_symref)
+					 ctx.qry.page,
+					 cache_safe_filename(ctx.qry.raw)));
+		if (ctx.qry.has_symref)
 			item->ttl = cgit_cache_dynamic_ttl;
-		else if (cgit_query_has_sha1)
+		else if (ctx.qry.has_sha1)
 			item->ttl = cgit_cache_static_ttl;
 		else
 			item->ttl = cgit_cache_repo_ttl;
@@ -98,12 +98,12 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	show_search = 0;
 	setenv("GIT_DIR", cgit_repo->path, 1);
 
-	if (!cgit_query_head) {
-		cgit_query_head = xstrdup(find_default_branch(cgit_repo));
-		cgit_repo->defbranch = cgit_query_head;
+	if (!ctx.qry.head) {
+		ctx.qry.head = xstrdup(find_default_branch(cgit_repo));
+		cgit_repo->defbranch = ctx.qry.head;
 	}
 
-	if (!cgit_query_head) {
+	if (!ctx.qry.head) {
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
 		cgit_print_error("Repository seems to be empty");
@@ -111,9 +111,9 @@ static void cgit_print_repo_page(struct cacheitem *item)
 		return;
 	}
 
-	if (get_sha1(cgit_query_head, sha1)) {
-		tmp = xstrdup(cgit_query_head);
-		cgit_query_head = cgit_repo->defbranch;
+	if (get_sha1(ctx.qry.head, sha1)) {
+		tmp = xstrdup(ctx.qry.head);
+		ctx.qry.head = cgit_repo->defbranch;
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
 		cgit_print_error(fmt("Invalid branch: %s", tmp));
@@ -122,20 +122,20 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	}
 
 	if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) {
-		cgit_print_snapshot(item, cgit_query_head, cgit_query_sha1,
+		cgit_print_snapshot(item, ctx.qry.head, ctx.qry.sha1,
 				    cgit_repobasename(cgit_repo->url),
-				    cgit_query_path,
+				    ctx.qry.path,
 				    cgit_repo->snapshots );
 		return;
 	}
 
 	if (cgit_cmd == CMD_PATCH) {
-		cgit_print_patch(cgit_query_sha1, item);
+		cgit_print_patch(ctx.qry.sha1, item);
 		return;
 	}
 
 	if (cgit_cmd == CMD_BLOB) {
-		cgit_print_blob(item, cgit_query_sha1, cgit_query_path);
+		cgit_print_blob(item, ctx.qry.sha1, ctx.qry.path);
 		return;
 	}
 
@@ -148,28 +148,28 @@ static void cgit_print_repo_page(struct cacheitem *item)
 		return;
 	}
 
-	cgit_print_pageheader(cgit_query_page, show_search);
+	cgit_print_pageheader(ctx.qry.page, show_search);
 
 	switch(cgit_cmd) {
 	case CMD_LOG:
-		cgit_print_log(cgit_query_sha1, cgit_query_ofs,
-			       cgit_max_commit_count, cgit_query_grep, cgit_query_search,
-			       cgit_query_path, 1);
+		cgit_print_log(ctx.qry.sha1, ctx.qry.ofs,
+			       cgit_max_commit_count, ctx.qry.grep, ctx.qry.search,
+			       ctx.qry.path, 1);
 		break;
 	case CMD_TREE:
-		cgit_print_tree(cgit_query_sha1, cgit_query_path);
+		cgit_print_tree(ctx.qry.sha1, ctx.qry.path);
 		break;
 	case CMD_COMMIT:
-		cgit_print_commit(cgit_query_sha1);
+		cgit_print_commit(ctx.qry.sha1);
 		break;
 	case CMD_REFS:
 		cgit_print_refs();
 		break;
 	case CMD_TAG:
-		cgit_print_tag(cgit_query_sha1);
+		cgit_print_tag(ctx.qry.sha1);
 		break;
 	case CMD_DIFF:
-		cgit_print_diff(cgit_query_sha1, cgit_query_sha2, cgit_query_path);
+		cgit_print_diff(ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path);
 		break;
 	default:
 		cgit_print_error("Invalid request");
@@ -264,24 +264,24 @@ static void cgit_parse_args(int argc, const char **argv)
 			cgit_nocache = 1;
 		}
 		if (!strncmp(argv[i], "--query=", 8)) {
-			cgit_querystring = xstrdup(argv[i]+8);
+			ctx.qry.raw = xstrdup(argv[i]+8);
 		}
 		if (!strncmp(argv[i], "--repo=", 7)) {
-			cgit_query_repo = xstrdup(argv[i]+7);
+			ctx.qry.repo = xstrdup(argv[i]+7);
 		}
 		if (!strncmp(argv[i], "--page=", 7)) {
-			cgit_query_page = xstrdup(argv[i]+7);
+			ctx.qry.page = xstrdup(argv[i]+7);
 		}
 		if (!strncmp(argv[i], "--head=", 7)) {
-			cgit_query_head = xstrdup(argv[i]+7);
-			cgit_query_has_symref = 1;
+			ctx.qry.head = xstrdup(argv[i]+7);
+			ctx.qry.has_symref = 1;
 		}
 		if (!strncmp(argv[i], "--sha1=", 7)) {
-			cgit_query_sha1 = xstrdup(argv[i]+7);
-			cgit_query_has_sha1 = 1;
+			ctx.qry.sha1 = xstrdup(argv[i]+7);
+			ctx.qry.has_sha1 = 1;
 		}
 		if (!strncmp(argv[i], "--ofs=", 6)) {
-			cgit_query_ofs = atoi(argv[i]+6);
+			ctx.qry.ofs = atoi(argv[i]+6);
 		}
 	}
 }
@@ -303,9 +303,9 @@ int main(int argc, const char **argv)
 	if (getenv("SCRIPT_NAME"))
 		cgit_script_name = xstrdup(getenv("SCRIPT_NAME"));
 	if (getenv("QUERY_STRING"))
-		cgit_querystring = xstrdup(getenv("QUERY_STRING"));
+		ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
 	cgit_parse_args(argc, argv);
-	cgit_parse_query(cgit_querystring, cgit_querystring_cb);
+	cgit_parse_query(ctx.qry.raw, cgit_querystring_cb);
 	if (!cgit_prepare_cache(&item))
 		return 0;
 	if (cgit_nocache) {
-- 
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.c')

diff --git a/cache.c b/cache.c
index b162952..2ed0d6f 100644
--- a/cache.c
+++ b/cache.c
@@ -44,21 +44,21 @@ int cache_create_dirs()
 {
 	char *path;
 
-	path = fmt("%s", cgit_cache_root);
+	path = fmt("%s", ctx.cfg.cache_root);
 	if (mkdir(path, S_IRWXU) && errno!=EEXIST)
 		return 0;
 
 	if (!cgit_repo)
 		return 0;
 
-	path = fmt("%s/%s", cgit_cache_root,
+	path = fmt("%s/%s", ctx.cfg.cache_root,
 		   cache_safe_filename(cgit_repo->url));
 
 	if (mkdir(path, S_IRWXU) && errno!=EEXIST)
 		return 0;
 
 	if (ctx.qry.page) {
-		path = fmt("%s/%s/%s", cgit_cache_root,
+		path = fmt("%s/%s/%s", ctx.cfg.cache_root,
 			   cache_safe_filename(cgit_repo->url),
 			   ctx.qry.page);
 		if (mkdir(path, S_IRWXU) && errno!=EEXIST)
@@ -74,7 +74,7 @@ int cache_refill_overdue(const char *lockfile)
 	if (stat(lockfile, &st))
 		return 0;
 	else
-		return (time(NULL) - st.st_mtime > cgit_cache_max_create_time);
+		return (time(NULL) - st.st_mtime > ctx.cfg.cache_max_create_time);
 }
 
 int cache_lock(struct cacheitem *item)
@@ -83,7 +83,7 @@ int cache_lock(struct cacheitem *item)
 	char *lockfile = xstrdup(fmt("%s.lock", item->name));
 
  top:
-	if (++i > cgit_max_lock_attempts)
+	if (++i > ctx.cfg.max_lock_attempts)
 		die("cache_lock: unable to lock %s: %s",
 		    item->name, strerror(errno));
 
diff --git a/cgit.c b/cgit.c
index 8a30c3c..f0907a1 100644
--- a/cgit.c
+++ b/cgit.c
@@ -11,7 +11,7 @@
 static int cgit_prepare_cache(struct cacheitem *item)
 {
 	if (!cgit_repo && ctx.qry.repo) {
-		char *title = fmt("%s - %s", cgit_root_title, "Bad request");
+		char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
 		cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo));
@@ -20,27 +20,27 @@ static int cgit_prepare_cache(struct cacheitem *item)
 	}
 
 	if (!cgit_repo) {
-		item->name = xstrdup(fmt("%s/index.html", cgit_cache_root));
-		item->ttl = cgit_cache_root_ttl;
+		item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root));
+		item->ttl = ctx.cfg.cache_root_ttl;
 		return 1;
 	}
 
 	if (!cgit_cmd) {
-		item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root,
+		item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root,
 					 cache_safe_filename(cgit_repo->url),
 					 cache_safe_filename(ctx.qry.raw)));
-		item->ttl = cgit_cache_repo_ttl;
+		item->ttl = ctx.cfg.cache_repo_ttl;
 	} else {
-		item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root,
+		item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root,
 					 cache_safe_filename(cgit_repo->url),
 					 ctx.qry.page,
 					 cache_safe_filename(ctx.qry.raw)));
 		if (ctx.qry.has_symref)
-			item->ttl = cgit_cache_dynamic_ttl;
+			item->ttl = ctx.cfg.cache_dynamic_ttl;
 		else if (ctx.qry.has_sha1)
-			item->ttl = cgit_cache_static_ttl;
+			item->ttl = ctx.cfg.cache_static_ttl;
 		else
-			item->ttl = cgit_cache_repo_ttl;
+			item->ttl = ctx.cfg.cache_repo_ttl;
 	}
 	return 1;
 }
@@ -85,7 +85,7 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	unsigned char sha1[20];
 
 	if (chdir(cgit_repo->path)) {
-		title = fmt("%s - %s", cgit_root_title, "Bad request");
+		title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
 		cgit_print_error(fmt("Unable to scan repository: %s",
@@ -153,7 +153,7 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	switch(cgit_cmd) {
 	case CMD_LOG:
 		cgit_print_log(ctx.qry.sha1, ctx.qry.ofs,
-			       cgit_max_commit_count, ctx.qry.grep, ctx.qry.search,
+			       ctx.cfg.max_commit_count, ctx.qry.grep, ctx.qry.search,
 			       ctx.qry.path, 1);
 		break;
 	case CMD_TREE:
@@ -212,7 +212,7 @@ static void cgit_check_cache(struct cacheitem *item)
 	int i = 0;
 
  top:
-	if (++i > cgit_max_lock_attempts) {
+	if (++i > ctx.cfg.max_lock_attempts) {
 		die("cgit_refresh_cache: unable to lock %s: %s",
 		    item->name, strerror(errno));
 	}
@@ -258,10 +258,10 @@ static void cgit_parse_args(int argc, const char **argv)
 
 	for (i = 1; i < argc; i++) {
 		if (!strncmp(argv[i], "--cache=", 8)) {
-			cgit_cache_root = xstrdup(argv[i]+8);
+			ctx.cfg.cache_root = xstrdup(argv[i]+8);
 		}
 		if (!strcmp(argv[i], "--nocache")) {
-			cgit_nocache = 1;
+			ctx.cfg.nocache = 1;
 		}
 		if (!strncmp(argv[i], "--query=", 8)) {
 			ctx.qry.raw = xstrdup(argv[i]+8);
@@ -291,6 +291,7 @@ int main(int argc, const char **argv)
 	struct cacheitem item;
 	const char *cgit_config_env = getenv("CGIT_CONFIG");
 
+	cgit_prepare_context(&ctx);
 	htmlfd = STDOUT_FILENO;
 	item.st.st_mtime = time(NULL);
 	cgit_repolist.length = 0;
@@ -301,14 +302,14 @@ int main(int argc, const char **argv)
 			 cgit_global_config_cb);
 	cgit_repo = NULL;
 	if (getenv("SCRIPT_NAME"))
-		cgit_script_name = xstrdup(getenv("SCRIPT_NAME"));
+		ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
 	if (getenv("QUERY_STRING"))
 		ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
 	cgit_parse_args(argc, argv);
 	cgit_parse_query(ctx.qry.raw, cgit_querystring_cb);
 	if (!cgit_prepare_cache(&item))
 		return 0;
-	if (cgit_nocache) {
+	if (ctx.cfg.nocache) {
 		cgit_fill_cache(&item, 0);
 	} else {
 		cgit_check_cache(&item);
diff --git a/cgit.h b/cgit.h
index 4576efb..0338ebd 100644
--- a/cgit.h
+++ b/cgit.h
@@ -139,8 +139,44 @@ struct cgit_query {
 	int   ofs;
 };
 
+struct cgit_config {
+	char *agefile;
+	char *cache_root;
+	char *clone_prefix;
+	char *css;
+	char *index_header;
+	char *index_info;
+	char *logo;
+	char *logo_link;
+	char *module_link;
+	char *repo_group;
+	char *robots;
+	char *root_title;
+	char *script_name;
+	char *virtual_root;
+	int cache_dynamic_ttl;
+	int cache_max_create_time;
+	int cache_repo_ttl;
+	int cache_root_ttl;
+	int cache_static_ttl;
+	int enable_index_links;
+	int enable_log_filecount;
+	int enable_log_linecount;
+	int max_commit_count;
+	int max_lock_attempts;
+	int max_msg_len;
+	int max_repodesc_len;
+	int nocache;
+	int renamelimit;
+	int snapshots;
+	int summary_branches;
+	int summary_log;
+	int summary_tags;
+};
+
 struct cgit_context {
 	struct cgit_query qry;
+	struct cgit_config cfg;
 };
 
 extern const char *cgit_version;
@@ -150,43 +186,9 @@ extern struct repoinfo *cgit_repo;
 extern struct cgit_context ctx;
 extern int cgit_cmd;
 
-extern char *cgit_root_title;
-extern char *cgit_css;
-extern char *cgit_logo;
-extern char *cgit_index_header;
-extern char *cgit_index_info;
-extern char *cgit_logo_link;
-extern char *cgit_module_link;
-extern char *cgit_agefile;
-extern char *cgit_virtual_root;
-extern char *cgit_script_name;
-extern char *cgit_cache_root;
-extern char *cgit_repo_group;
-extern char *cgit_robots;
-extern char *cgit_clone_prefix;
-
-extern int cgit_nocache;
-extern int cgit_snapshots;
-extern int cgit_enable_index_links;
-extern int cgit_enable_log_filecount;
-extern int cgit_enable_log_linecount;
-extern int cgit_max_lock_attempts;
-extern int cgit_cache_root_ttl;
-extern int cgit_cache_repo_ttl;
-extern int cgit_cache_dynamic_ttl;
-extern int cgit_cache_static_ttl;
-extern int cgit_cache_max_create_time;
-extern int cgit_summary_log;
-extern int cgit_summary_tags;
-extern int cgit_summary_branches;
-
-extern int cgit_max_msg_len;
-extern int cgit_max_repodesc_len;
-extern int cgit_max_commit_count;
-
-
 extern int htmlfd;
 
+extern void cgit_prepare_context(struct cgit_context *ctx);
 extern int cgit_get_cmd_index(const char *cmd);
 extern struct repoinfo *cgit_get_repoinfo(const char *url);
 extern void cgit_global_config_cb(const char *name, const char *value);
diff --git a/shared.c b/shared.c
index 6c1a762..8dd2b00 100644
--- a/shared.c
+++ b/shared.c
@@ -15,43 +15,31 @@ int cgit_cmd;
 
 const char *cgit_version = CGIT_VERSION;
 
-char *cgit_root_title   = "Git repository browser";
-char *cgit_css          = "/cgit.css";
-char *cgit_logo         = "/git-logo.png";
-char *cgit_index_header = NULL;
-char *cgit_index_info   = NULL;
-char *cgit_logo_link    = "http://www.kernel.org/pub/software/scm/git/docs/";
-char *cgit_module_link  = "./?repo=%s&page=commit&id=%s";
-char *cgit_agefile      = "info/web/last-modified";
-char *cgit_virtual_root = NULL;
-char *cgit_script_name  = CGIT_SCRIPT_NAME;
-char *cgit_cache_root   = CGIT_CACHE_ROOT;
-char *cgit_repo_group   = NULL;
-char *cgit_robots       = "index, nofollow";
-char *cgit_clone_prefix = NULL;
-
-int cgit_nocache               =  0;
-int cgit_snapshots             =  0;
-int cgit_enable_index_links    =  0;
-int cgit_enable_log_filecount  =  0;
-int cgit_enable_log_linecount  =  0;
-int cgit_max_lock_attempts     =  5;
-int cgit_cache_root_ttl        =  5;
-int cgit_cache_repo_ttl        =  5;
-int cgit_cache_dynamic_ttl     =  5;
-int cgit_cache_static_ttl      = -1;
-int cgit_cache_max_create_time =  5;
-int cgit_summary_log           =  0;
-int cgit_summary_tags          =  0;
-int cgit_summary_branches      =  0;
-int cgit_renamelimit           = -1;
-
-int cgit_max_msg_len = 60;
-int cgit_max_repodesc_len = 60;
-int cgit_max_commit_count = 50;
-
 int htmlfd = 0;
 
+void cgit_prepare_context(struct cgit_context *ctx)
+{
+	memset(ctx, 0, sizeof(ctx));
+	ctx->cfg.agefile = "info/web/last-modified";
+	ctx->cfg.cache_dynamic_ttl = 5;
+	ctx->cfg.cache_max_create_time = 5;
+	ctx->cfg.cache_repo_ttl = 5;
+	ctx->cfg.cache_root = CGIT_CACHE_ROOT;
+	ctx->cfg.cache_root_ttl = 5;
+	ctx->cfg.cache_static_ttl = -1;
+	ctx->cfg.css = "/cgit.css";
+	ctx->cfg.logo = "/git-logo.png";
+	ctx->cfg.max_commit_count = 50;
+	ctx->cfg.max_lock_attempts = 5;
+	ctx->cfg.max_msg_len = 60;
+	ctx->cfg.max_repodesc_len = 60;
+	ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
+	ctx->cfg.renamelimit = -1;
+	ctx->cfg.robots = "index, nofollow";
+	ctx->cfg.root_title = "Git repository browser";
+	ctx->cfg.script_name = CGIT_SCRIPT_NAME;
+}
+
 int cgit_get_cmd_index(const char *cmd)
 {
 	static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
@@ -105,12 +93,12 @@ struct repoinfo *add_repo(const char *url)
 	ret->path = NULL;
 	ret->desc = "[no description]";
 	ret->owner = NULL;
-	ret->group = cgit_repo_group;
+	ret->group = ctx.cfg.repo_group;
 	ret->defbranch = "master";
-	ret->snapshots = cgit_snapshots;
-	ret->enable_log_filecount = cgit_enable_log_filecount;
-	ret->enable_log_linecount = cgit_enable_log_linecount;
-	ret->module_link = cgit_module_link;
+	ret->snapshots = ctx.cfg.snapshots;
+	ret->enable_log_filecount = ctx.cfg.enable_log_filecount;
+	ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
+	ret->module_link = ctx.cfg.module_link;
 	ret->readme = NULL;
 	return ret;
 }
@@ -131,65 +119,65 @@ struct repoinfo *cgit_get_repoinfo(const char *url)
 void cgit_global_config_cb(const char *name, const char *value)
 {
 	if (!strcmp(name, "root-title"))
-		cgit_root_title = xstrdup(value);
+		ctx.cfg.root_title = xstrdup(value);
 	else if (!strcmp(name, "css"))
-		cgit_css = xstrdup(value);
+		ctx.cfg.css = xstrdup(value);
 	else if (!strcmp(name, "logo"))
-		cgit_logo = xstrdup(value);
+		ctx.cfg.logo = xstrdup(value);
 	else if (!strcmp(name, "index-header"))
-		cgit_index_header = xstrdup(value);
+		ctx.cfg.index_header = xstrdup(value);
 	else if (!strcmp(name, "index-info"))
-		cgit_index_info = xstrdup(value);
+		ctx.cfg.index_info = xstrdup(value);
 	else if (!strcmp(name, "logo-link"))
-		cgit_logo_link = xstrdup(value);
+		ctx.cfg.logo_link = xstrdup(value);
 	else if (!strcmp(name, "module-link"))
-		cgit_module_link = xstrdup(value);
+		ctx.cfg.module_link = xstrdup(value);
 	else if (!strcmp(name, "virtual-root")) {
-		cgit_virtual_root = trim_end(value, '/');
-		if (!cgit_virtual_root && (!strcmp(value, "/")))
-			cgit_virtual_root = "";
+		ctx.cfg.virtual_root = trim_end(value, '/');
+		if (!ctx.cfg.virtual_root && (!strcmp(value, "/")))
+			ctx.cfg.virtual_root = "";
 	} else if (!strcmp(name, "nocache"))
-		cgit_nocache = atoi(value);
+		ctx.cfg.nocache = atoi(value);
 	else if (!strcmp(name, "snapshots"))
-		cgit_snapshots = cgit_parse_snapshots_mask(value);
+		ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
 	else if (!strcmp(name, "enable-index-links"))
-		cgit_enable_index_links = atoi(value);
+		ctx.cfg.enable_index_links = atoi(value);
 	else if (!strcmp(name, "enable-log-filecount"))
-		cgit_enable_log_filecount = atoi(value);
+		ctx.cfg.enable_log_filecount = atoi(value);
 	else if (!strcmp(name, "enable-log-linecount"))
-		cgit_enable_log_linecount = atoi(value);
+		ctx.cfg.enable_log_linecount = atoi(value);
 	else if (!strcmp(name, "cache-root"))
-		cgit_cache_root = xstrdup(value);
+		ctx.cfg.cache_root = xstrdup(value);
 	else if (!strcmp(name, "cache-root-ttl"))
-		cgit_cache_root_ttl = atoi(value);
+		ctx.cfg.cache_root_ttl = atoi(value);
 	else if (!strcmp(name, "cache-repo-ttl"))
-		cgit_cache_repo_ttl = atoi(value);
+		ctx.cfg.cache_repo_ttl = atoi(value);
 	else if (!strcmp(name, "cache-static-ttl"))
-		cgit_cache_static_ttl = atoi(value);
+		ctx.cfg.cache_static_ttl = atoi(value);
 	else if (!strcmp(name, "cache-dynamic-ttl"))
-		cgit_cache_dynamic_ttl = atoi(value);
+		ctx.cfg.cache_dynamic_ttl = atoi(value);
 	else if (!strcmp(name, "max-message-length"))
-		cgit_max_msg_len = atoi(value);
+		ctx.cfg.max_msg_len = atoi(value);
 	else if (!strcmp(name, "max-repodesc-length"))
-		cgit_max_repodesc_len = atoi(value);
+		ctx.cfg.max_repodesc_len = atoi(value);
 	else if (!strcmp(name, "max-commit-count"))
-		cgit_max_commit_count = atoi(value);
+		ctx.cfg.max_commit_count = atoi(value);
 	else if (!strcmp(name, "summary-log"))
-		cgit_summary_log = atoi(value);
+		ctx.cfg.summary_log = atoi(value);
 	else if (!strcmp(name, "summary-branches"))
-		cgit_summary_branches = atoi(value);
+		ctx.cfg.summary_branches = atoi(value);
 	else if (!strcmp(name, "summary-tags"))
-		cgit_summary_tags = atoi(value);
+		ctx.cfg.summary_tags = atoi(value);
 	else if (!strcmp(name, "agefile"))
-		cgit_agefile = xstrdup(value);
+		ctx.cfg.agefile = xstrdup(value);
 	else if (!strcmp(name, "renamelimit"))
-		cgit_renamelimit = atoi(value);
+		ctx.cfg.renamelimit = atoi(value);
 	else if (!strcmp(name, "robots"))
-		cgit_robots = xstrdup(value);
+		ctx.cfg.robots = xstrdup(value);
 	else if (!strcmp(name, "clone-prefix"))
-		cgit_clone_prefix = xstrdup(value);
+		ctx.cfg.clone_prefix = xstrdup(value);
 	else if (!strcmp(name, "repo.group"))
-		cgit_repo_group = xstrdup(value);
+		ctx.cfg.repo_group = xstrdup(value);
 	else if (!strcmp(name, "repo.url"))
 		cgit_repo = add_repo(value);
 	else if (!strcmp(name, "repo.name"))
@@ -205,11 +193,11 @@ void cgit_global_config_cb(const char *name, const char *value)
 	else if (cgit_repo && !strcmp(name, "repo.defbranch"))
 		cgit_repo->defbranch = xstrdup(value);
 	else if (cgit_repo && !strcmp(name, "repo.snapshots"))
-		cgit_repo->snapshots = cgit_snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
+		cgit_repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
 	else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
-		cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
+		cgit_repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
 	else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
-		cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value);
+		cgit_repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
 	else if (cgit_repo && !strcmp(name, "repo.module-link"))
 		cgit_repo->module_link= xstrdup(value);
 	else if (cgit_repo && !strcmp(name, "repo.readme") && value != NULL) {
@@ -476,7 +464,7 @@ void cgit_diff_tree(const unsigned char *old_sha1,
 	diff_setup(&opt);
 	opt.output_format = DIFF_FORMAT_CALLBACK;
 	opt.detect_rename = 1;
-	opt.rename_limit = cgit_renamelimit;
+	opt.rename_limit = ctx.cfg.renamelimit;
 	DIFF_OPT_SET(&opt, RECURSIVE);
 	opt.format_callback = cgit_diff_tree_cb;
 	opt.format_callback_data = fn;
diff --git a/ui-repolist.c b/ui-repolist.c
index 3e97ca9..a6cc2cc 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -30,7 +30,7 @@ static void print_modtime(struct repoinfo *repo)
 	char *path;
 	struct stat s;
 
-	path = fmt("%s/%s", repo->path, cgit_agefile);
+	path = fmt("%s/%s", repo->path, ctx.cfg.agefile);
 	if (stat(path, &s) == 0) {
 		cgit_print_age(read_agefile(path), -1, NULL);
 		return;
@@ -47,17 +47,17 @@ void cgit_print_repolist(struct cacheitem *item)
 	int i, columns = 4;
 	char *last_group = NULL;
 
-	if (cgit_enable_index_links)
+	if (ctx.cfg.enable_index_links)
 		columns++;
 
-	cgit_print_docstart(cgit_root_title, item);
-	cgit_print_pageheader(cgit_root_title, 0);
+	cgit_print_docstart(ctx.cfg.root_title, item);
+	cgit_print_pageheader(ctx.cfg.root_title, 0);
 
 	html("<table summary='repository list' class='list nowrap'>");
-	if (cgit_index_header) {
+	if (ctx.cfg.index_header) {
 		htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>",
 		      columns);
-		html_include(cgit_index_header);
+		html_include(ctx.cfg.index_header);
 		html("</td></tr>");
 	}
 	html("<tr class='nohover'>"
@@ -65,7 +65,7 @@ void cgit_print_repolist(struct cacheitem *item)
 	     "<th class='left'>Description</th>"
 	     "<th class='left'>Owner</th>"
 	     "<th class='left'>Idle</th>");
-	if (cgit_enable_index_links)
+	if (ctx.cfg.enable_index_links)
 		html("<th>Links</th>");
 	html("</tr>\n");
 
@@ -87,13 +87,13 @@ void cgit_print_repolist(struct cacheitem *item)
 		html_txt(cgit_repo->name);
 		html_link_close();
 		html("</td><td>");
-		html_ntxt(cgit_max_repodesc_len, cgit_repo->desc);
+		html_ntxt(ctx.cfg.max_repodesc_len, cgit_repo->desc);
 		html("</td><td>");
 		html_txt(cgit_repo->owner);
 		html("</td><td>");
 		print_modtime(cgit_repo);
 		html("</td>");
-		if (cgit_enable_index_links) {
+		if (ctx.cfg.enable_index_links) {
 			html("<td>");
 			html_link_open(cgit_repourl(cgit_repo->url),
 				       NULL, "button");
diff --git a/ui-shared.c b/ui-shared.c
index 6a41fb0..b96237d 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -42,16 +42,16 @@ void cgit_print_error(char *msg)
 
 char *cgit_rooturl()
 {
-	if (cgit_virtual_root)
-		return fmt("%s/", cgit_virtual_root);
+	if (ctx.cfg.virtual_root)
+		return fmt("%s/", ctx.cfg.virtual_root);
 	else
-		return cgit_script_name;
+		return ctx.cfg.script_name;
 }
 
 char *cgit_repourl(const char *reponame)
 {
-	if (cgit_virtual_root) {
-		return fmt("%s/%s/", cgit_virtual_root, reponame);
+	if (ctx.cfg.virtual_root) {
+		return fmt("%s/%s/", ctx.cfg.virtual_root, reponame);
 	} else {
 		return fmt("?r=%s", reponame);
 	}
@@ -63,8 +63,8 @@ char *cgit_fileurl(const char *reponame, const char *pagename,
 	char *tmp;
 	char *delim;
 
-	if (cgit_virtual_root) {
-		tmp = fmt("%s/%s/%s/%s", cgit_virtual_root, reponame,
+	if (ctx.cfg.virtual_root) {
+		tmp = fmt("%s/%s/%s/%s", ctx.cfg.virtual_root, reponame,
 			  pagename, (filename ? filename:""));
 		delim = "?";
 	} else {
@@ -110,14 +110,14 @@ const char *cgit_repobasename(const char *reponame)
 
 char *cgit_currurl()
 {
-	if (!cgit_virtual_root)
-		return cgit_script_name;
+	if (!ctx.cfg.virtual_root)
+		return ctx.cfg.script_name;
 	else if (ctx.qry.page)
-		return fmt("%s/%s/%s/", cgit_virtual_root, ctx.qry.repo, ctx.qry.page);
+		return fmt("%s/%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo, ctx.qry.page);
 	else if (ctx.qry.repo)
-		return fmt("%s/%s/", cgit_virtual_root, ctx.qry.repo);
+		return fmt("%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo);
 	else
-		return fmt("%s/", cgit_virtual_root);
+		return fmt("%s/", ctx.cfg.virtual_root);
 }
 
 static char *repolink(char *title, char *class, char *page, char *head,
@@ -137,9 +137,9 @@ static char *repolink(char *title, char *class, char *page, char *head,
 		html("'");
 	}
 	html(" href='");
-	if (cgit_virtual_root) {
-		html_attr(cgit_virtual_root);
-		if (cgit_virtual_root[strlen(cgit_virtual_root) - 1] != '/')
+	if (ctx.cfg.virtual_root) {
+		html_attr(ctx.cfg.virtual_root);
+		if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/')
 			html("/");
 		html_attr(cgit_repo->url);
 		if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
@@ -151,7 +151,7 @@ static char *repolink(char *title, char *class, char *page, char *head,
 				html_attr(path);
 		}
 	} else {
-		html(cgit_script_name);
+		html(ctx.cfg.script_name);
 		html("?url=");
 		html_attr(cgit_repo->url);
 		if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
@@ -229,11 +229,11 @@ void cgit_log_link(char *name, char *title, char *class, char *head,
 void cgit_commit_link(char *name, char *title, char *class, char *head,
 		      char *rev)
 {
-	if (strlen(name) > cgit_max_msg_len && cgit_max_msg_len >= 15) {
-		name[cgit_max_msg_len] = '\0';
-		name[cgit_max_msg_len - 1] = '.';
-		name[cgit_max_msg_len - 2] = '.';
-		name[cgit_max_msg_len - 3] = '.';
+	if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) {
+		name[ctx.cfg.max_msg_len] = '\0';
+		name[ctx.cfg.max_msg_len - 1] = '.';
+		name[ctx.cfg.max_msg_len - 2] = '.';
+		name[ctx.cfg.max_msg_len - 3] = '.';
 	}
 	reporevlink("commit", name, title, class, head, rev, NULL);
 }
@@ -374,10 +374,10 @@ void cgit_print_docstart(char *title, struct cacheitem *item)
 	html_txt(title);
 	html("</title>\n");
 	htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version);
-	if (cgit_robots && *cgit_robots)
-		htmlf("<meta name='robots' content='%s'/>\n", cgit_robots);
+	if (ctx.cfg.robots && *ctx.cfg.robots)
+		htmlf("<meta name='robots' content='%s'/>\n", ctx.cfg.robots);
 	html("<link rel='stylesheet' type='text/css' href='");
-	html_attr(cgit_css);
+	html_attr(ctx.cfg.css);
 	html("'/>\n");
 	html("</head>\n");
 	html("<body>\n");
@@ -439,7 +439,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page)
 {
 	char *url;
 
-	if (!cgit_virtual_root) {
+	if (!ctx.cfg.virtual_root) {
 		url = fmt("%s/%s", ctx.qry.repo, page);
 		if (ctx.qry.path)
 			url = fmt("%s/%s", url, ctx.qry.path);
@@ -474,7 +474,7 @@ void cgit_print_pageheader(char *title, int show_search)
 	html("<tr><td class='sidebar'>\n<a href='");
 	html_attr(cgit_rooturl());
 	htmlf("'><img src='%s' alt='cgit'/></a>\n",
-	      cgit_logo);
+	      ctx.cfg.logo);
 	html("</td></tr>\n<tr><td class='sidebar'>\n");
 	if (ctx.qry.repo) {
 		html("<h1 class='first'>");
@@ -501,12 +501,12 @@ void cgit_print_pageheader(char *title, int show_search)
 
 		for_each_ref(print_archive_ref, &header);
 
-		if (cgit_repo->clone_url || cgit_clone_prefix) {
+		if (cgit_repo->clone_url || ctx.cfg.clone_prefix) {
 			html("<h1>clone</h1>\n");
 			if (cgit_repo->clone_url)
 				url = cgit_repo->clone_url;
 			else
-				url = fmt("%s%s", cgit_clone_prefix,
+				url = fmt("%s%s", ctx.cfg.clone_prefix,
 					  cgit_repo->url);
 			html("<a class='menu' href='");
 			html_attr(url);
@@ -531,7 +531,7 @@ void cgit_print_pageheader(char *title, int show_search)
 
 		html("<h1>search</h1>\n");
 		html("<form method='get' action='");
-		if (cgit_virtual_root)
+		if (ctx.cfg.virtual_root)
 			html_attr(cgit_fileurl(ctx.qry.repo, "log",
 					       ctx.qry.path, NULL));
 		html("'>\n");
@@ -546,7 +546,7 @@ void cgit_print_pageheader(char *title, int show_search)
 		html("'/>\n");
 		html("</form>\n");
 	} else {
-		if (!cgit_index_info || html_include(cgit_index_info))
+		if (!ctx.cfg.index_info || html_include(ctx.cfg.index_info))
 			html(default_info);
 	}
 
diff --git a/ui-summary.c b/ui-summary.c
index bbd4464..0a44994 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -187,14 +187,14 @@ void cgit_print_summary()
 		html_include(cgit_repo->readme);
 		html("</div>");
 	}
-	if (cgit_summary_log > 0)
-		cgit_print_log(ctx.qry.head, 0, cgit_summary_log, NULL,
+	if (ctx.cfg.summary_log > 0)
+		cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL,
 			       NULL, NULL, 0);
 	html("<table summary='repository info' class='list nowrap'>");
-	if (cgit_summary_log > 0)
+	if (ctx.cfg.summary_log > 0)
 		html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
-	cgit_print_branches(cgit_summary_branches);
+	cgit_print_branches(ctx.cfg.summary_branches);
 	html("<tr class='nohover'><td colspan='4'>&nbsp;</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.c')

diff --git a/cache.c b/cache.c
index 2ed0d6f..7860fc7 100644
--- a/cache.c
+++ b/cache.c
@@ -48,18 +48,18 @@ int cache_create_dirs()
 	if (mkdir(path, S_IRWXU) && errno!=EEXIST)
 		return 0;
 
-	if (!cgit_repo)
+	if (!ctx.repo)
 		return 0;
 
 	path = fmt("%s/%s", ctx.cfg.cache_root,
-		   cache_safe_filename(cgit_repo->url));
+		   cache_safe_filename(ctx.repo->url));
 
 	if (mkdir(path, S_IRWXU) && errno!=EEXIST)
 		return 0;
 
 	if (ctx.qry.page) {
 		path = fmt("%s/%s/%s", ctx.cfg.cache_root,
-			   cache_safe_filename(cgit_repo->url),
+			   cache_safe_filename(ctx.repo->url),
 			   ctx.qry.page);
 		if (mkdir(path, S_IRWXU) && errno!=EEXIST)
 			return 0;
diff --git a/cgit.c b/cgit.c
index f0907a1..b270fdc 100644
--- a/cgit.c
+++ b/cgit.c
@@ -10,7 +10,7 @@
 
 static int cgit_prepare_cache(struct cacheitem *item)
 {
-	if (!cgit_repo && ctx.qry.repo) {
+	if (!ctx.repo && ctx.qry.repo) {
 		char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
@@ -19,7 +19,7 @@ static int cgit_prepare_cache(struct cacheitem *item)
 		return 0;
 	}
 
-	if (!cgit_repo) {
+	if (!ctx.repo) {
 		item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root));
 		item->ttl = ctx.cfg.cache_root_ttl;
 		return 1;
@@ -27,12 +27,12 @@ static int cgit_prepare_cache(struct cacheitem *item)
 
 	if (!cgit_cmd) {
 		item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root,
-					 cache_safe_filename(cgit_repo->url),
+					 cache_safe_filename(ctx.repo->url),
 					 cache_safe_filename(ctx.qry.raw)));
 		item->ttl = ctx.cfg.cache_repo_ttl;
 	} else {
 		item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root,
-					 cache_safe_filename(cgit_repo->url),
+					 cache_safe_filename(ctx.repo->url),
 					 ctx.qry.page,
 					 cache_safe_filename(ctx.qry.raw)));
 		if (ctx.qry.has_symref)
@@ -64,7 +64,7 @@ int find_current_ref(const char *refname, const unsigned char *sha1,
 	return info->match;
 }
 
-char *find_default_branch(struct repoinfo *repo)
+char *find_default_branch(struct cgit_repo *repo)
 {
 	struct refmatch info;
 
@@ -84,7 +84,7 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	int show_search;
 	unsigned char sha1[20];
 
-	if (chdir(cgit_repo->path)) {
+	if (chdir(ctx.repo->path)) {
 		title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
@@ -94,13 +94,13 @@ static void cgit_print_repo_page(struct cacheitem *item)
 		return;
 	}
 
-	title = fmt("%s - %s", cgit_repo->name, cgit_repo->desc);
+	title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc);
 	show_search = 0;
-	setenv("GIT_DIR", cgit_repo->path, 1);
+	setenv("GIT_DIR", ctx.repo->path, 1);
 
 	if (!ctx.qry.head) {
-		ctx.qry.head = xstrdup(find_default_branch(cgit_repo));
-		cgit_repo->defbranch = ctx.qry.head;
+		ctx.qry.head = xstrdup(find_default_branch(ctx.repo));
+		ctx.repo->defbranch = ctx.qry.head;
 	}
 
 	if (!ctx.qry.head) {
@@ -113,7 +113,7 @@ static void cgit_print_repo_page(struct cacheitem *item)
 
 	if (get_sha1(ctx.qry.head, sha1)) {
 		tmp = xstrdup(ctx.qry.head);
-		ctx.qry.head = cgit_repo->defbranch;
+		ctx.qry.head = ctx.repo->defbranch;
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
 		cgit_print_error(fmt("Invalid branch: %s", tmp));
@@ -121,11 +121,11 @@ static void cgit_print_repo_page(struct cacheitem *item)
 		return;
 	}
 
-	if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) {
+	if ((cgit_cmd == CMD_SNAPSHOT) && ctx.repo->snapshots) {
 		cgit_print_snapshot(item, ctx.qry.head, ctx.qry.sha1,
-				    cgit_repobasename(cgit_repo->url),
+				    cgit_repobasename(ctx.repo->url),
 				    ctx.qry.path,
-				    cgit_repo->snapshots );
+				    ctx.repo->snapshots );
 		return;
 	}
 
@@ -192,7 +192,7 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache)
 		chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)");
 	}
 
-	if (cgit_repo)
+	if (ctx.repo)
 		cgit_print_repo_page(item);
 	else
 		cgit_print_repolist(item);
@@ -300,7 +300,6 @@ int main(int argc, const char **argv)
 
 	cgit_read_config(cgit_config_env ? cgit_config_env : CGIT_CONFIG,
 			 cgit_global_config_cb);
-	cgit_repo = NULL;
 	if (getenv("SCRIPT_NAME"))
 		ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
 	if (getenv("QUERY_STRING"))
diff --git a/cgit.h b/cgit.h
index 0338ebd..598d8c3 100644
--- a/cgit.h
+++ b/cgit.h
@@ -66,7 +66,7 @@ struct cacheitem {
 	int fd;
 };
 
-struct repoinfo {
+struct cgit_repo {
 	char *url;
 	char *name;
 	char *path;
@@ -82,10 +82,10 @@ struct repoinfo {
 	int enable_log_linecount;
 };
 
-struct repolist {
+struct cgit_repolist {
 	int length;
 	int count;
-	struct repoinfo *repos;
+	struct cgit_repo *repos;
 };
 
 struct commitinfo {
@@ -177,12 +177,12 @@ struct cgit_config {
 struct cgit_context {
 	struct cgit_query qry;
 	struct cgit_config cfg;
+	struct cgit_repo *repo;
 };
 
 extern const char *cgit_version;
 
-extern struct repolist cgit_repolist;
-extern struct repoinfo *cgit_repo;
+extern struct cgit_repolist cgit_repolist;
 extern struct cgit_context ctx;
 extern int cgit_cmd;
 
@@ -190,7 +190,7 @@ extern int htmlfd;
 
 extern void cgit_prepare_context(struct cgit_context *ctx);
 extern int cgit_get_cmd_index(const char *cmd);
-extern struct repoinfo *cgit_get_repoinfo(const char *url);
+extern struct cgit_repo *cgit_get_repoinfo(const char *url);
 extern void cgit_global_config_cb(const char *name, const char *value);
 extern void cgit_repo_config_cb(const char *name, const char *value);
 extern void cgit_querystring_cb(const char *name, const char *value);
diff --git a/parsing.c b/parsing.c
index 8cf56a4..027f06b 100644
--- a/parsing.c
+++ b/parsing.c
@@ -143,27 +143,27 @@ void cgit_parse_url(const char *url)
 {
 	char *cmd, *p;
 
-	cgit_repo = NULL;
+	ctx.repo = NULL;
 	if (!url || url[0] == '\0')
 		return;
 
-	cgit_repo = cgit_get_repoinfo(url);
-	if (cgit_repo) {
-		ctx.qry.repo = cgit_repo->url;
+	ctx.repo = cgit_get_repoinfo(url);
+	if (ctx.repo) {
+		ctx.qry.repo = ctx.repo->url;
 		return;
 	}
 
 	cmd = strchr(url, '/');
-	while (!cgit_repo && cmd) {
+	while (!ctx.repo && cmd) {
 		cmd[0] = '\0';
-		cgit_repo = cgit_get_repoinfo(url);
-		if (cgit_repo == NULL) {
+		ctx.repo = cgit_get_repoinfo(url);
+		if (ctx.repo == NULL) {
 			cmd[0] = '/';
 			cmd = strchr(cmd + 1, '/');
 			continue;
 		}
 
-		ctx.qry.repo = cgit_repo->url;
+		ctx.qry.repo = ctx.repo->url;
 		p = strchr(cmd + 1, '/');
 		if (p) {
 			p[0] = '\0';
diff --git a/shared.c b/shared.c
index 8dd2b00..808e674 100644
--- a/shared.c
+++ b/shared.c
@@ -8,8 +8,7 @@
 
 #include "cgit.h"
 
-struct repolist cgit_repolist;
-struct repoinfo *cgit_repo;
+struct cgit_repolist cgit_repolist;
 struct cgit_context ctx;
 int cgit_cmd;
 
@@ -73,9 +72,9 @@ int chk_non_negative(int result, char *msg)
 	return result;
 }
 
-struct repoinfo *add_repo(const char *url)
+struct cgit_repo *add_repo(const char *url)
 {
-	struct repoinfo *ret;
+	struct cgit_repo *ret;
 
 	if (++cgit_repolist.count > cgit_repolist.length) {
 		if (cgit_repolist.length == 0)
@@ -84,7 +83,7 @@ struct repoinfo *add_repo(const char *url)
 			cgit_repolist.length *= 2;
 		cgit_repolist.repos = xrealloc(cgit_repolist.repos,
 					       cgit_repolist.length *
-					       sizeof(struct repoinfo));
+					       sizeof(struct cgit_repo));
 	}
 
 	ret = &cgit_repolist.repos[cgit_repolist.count-1];
@@ -103,10 +102,10 @@ struct repoinfo *add_repo(const char *url)
 	return ret;
 }
 
-struct repoinfo *cgit_get_repoinfo(const char *url)
+struct cgit_repo *cgit_get_repoinfo(const char *url)
 {
 	int i;
-	struct repoinfo *repo;
+	struct cgit_repo *repo;
 
 	for (i=0; i<cgit_repolist.count; i++) {
 		repo = &cgit_repolist.repos[i];
@@ -179,32 +178,32 @@ void cgit_global_config_cb(const char *name, const char *value)
 	else if (!strcmp(name, "repo.group"))
 		ctx.cfg.repo_group = xstrdup(value);
 	else if (!strcmp(name, "repo.url"))
-		cgit_repo = add_repo(value);
+		ctx.repo = add_repo(value);
 	else if (!strcmp(name, "repo.name"))
-		cgit_repo->name = xstrdup(value);
-	else if (cgit_repo && !strcmp(name, "repo.path"))
-		cgit_repo->path = trim_end(value, '/');
-	else if (cgit_repo && !strcmp(name, "repo.clone-url"))
-		cgit_repo->clone_url = xstrdup(value);
-	else if (cgit_repo && !strcmp(name, "repo.desc"))
-		cgit_repo->desc = xstrdup(value);
-	else if (cgit_repo && !strcmp(name, "repo.owner"))
-		cgit_repo->owner = xstrdup(value);
-	else if (cgit_repo && !strcmp(name, "repo.defbranch"))
-		cgit_repo->defbranch = xstrdup(value);
-	else if (cgit_repo && !strcmp(name, "repo.snapshots"))
-		cgit_repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
-	else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
-		cgit_repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
-	else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
-		cgit_repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
-	else if (cgit_repo && !strcmp(name, "repo.module-link"))
-		cgit_repo->module_link= xstrdup(value);
-	else if (cgit_repo && !strcmp(name, "repo.readme") && value != NULL) {
+		ctx.repo->name = xstrdup(value);
+	else if (ctx.repo && !strcmp(name, "repo.path"))
+		ctx.repo->path = trim_end(value, '/');
+	else if (ctx.repo && !strcmp(name, "repo.clone-url"))
+		ctx.repo->clone_url = xstrdup(value);
+	else if (ctx.repo && !strcmp(name, "repo.desc"))
+		ctx.repo->desc = xstrdup(value);
+	else if (ctx.repo && !strcmp(name, "repo.owner"))
+		ctx.repo->owner = xstrdup(value);
+	else if (ctx.repo && !strcmp(name, "repo.defbranch"))
+		ctx.repo->defbranch = xstrdup(value);
+	else if (ctx.repo && !strcmp(name, "repo.snapshots"))
+		ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
+	else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount"))
+		ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
+	else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount"))
+		ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
+	else if (ctx.repo && !strcmp(name, "repo.module-link"))
+		ctx.repo->module_link= xstrdup(value);
+	else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) {
 		if (*value == '/')
-			cgit_repo->readme = xstrdup(value);
+			ctx.repo->readme = xstrdup(value);
 		else
-			cgit_repo->readme = xstrdup(fmt("%s/%s", cgit_repo->path, value));
+			ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value));
 	} else if (!strcmp(name, "include"))
 		cgit_read_config(value, cgit_global_config_cb);
 }
@@ -213,7 +212,7 @@ void cgit_querystring_cb(const char *name, const char *value)
 {
 	if (!strcmp(name,"r")) {
 		ctx.qry.repo = xstrdup(value);
-		cgit_repo = cgit_get_repoinfo(value);
+		ctx.repo = cgit_get_repoinfo(value);
 	} else if (!strcmp(name, "p")) {
 		ctx.qry.page = xstrdup(value);
 		cgit_cmd = cgit_get_cmd_index(value);
diff --git a/ui-commit.c b/ui-commit.c
index 3b0919b..25721ca 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -194,10 +194,10 @@ void cgit_print_commit(char *hex)
 			       sha1_to_hex(p->item->object.sha1), NULL);
 		html(")</td></tr>");
 	}
-	if (cgit_repo->snapshots) {
+	if (ctx.repo->snapshots) {
 		html("<tr><th>download</th><td colspan='2' class='sha1'>");
 		cgit_print_snapshot_links(ctx.qry.repo, ctx.qry.head,
-					  hex, cgit_repo->snapshots);
+					  hex, ctx.repo->snapshots);
 		html("</td></tr>");
 	}
 	html("</table>\n");
diff --git a/ui-log.c b/ui-log.c
index a39474b..72e2a4b 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -25,7 +25,7 @@ void count_lines(char *line, int size)
 void inspect_files(struct diff_filepair *pair)
 {
 	files++;
-	if (cgit_repo->enable_log_linecount)
+	if (ctx.repo->enable_log_linecount)
 		cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines);
 }
 
@@ -39,14 +39,14 @@ void print_commit(struct commit *commit)
 	html("</td><td>");
 	cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head,
 			 sha1_to_hex(commit->object.sha1));
-	if (cgit_repo->enable_log_filecount) {
+	if (ctx.repo->enable_log_filecount) {
 		files = 0;
 		add_lines = 0;
 		rem_lines = 0;
 		cgit_diff_commit(commit, inspect_files);
 		html("</td><td class='right'>");
 		htmlf("%d", files);
-		if (cgit_repo->enable_log_linecount) {
+		if (ctx.repo->enable_log_linecount) {
 			html("</td><td class='right'>");
 			htmlf("-%d/+%d", rem_lines, add_lines);
 		}
@@ -94,9 +94,9 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
 	html("<tr class='nohover'><th class='left'>Age</th>"
 	     "<th class='left'>Message</th>");
 
-	if (cgit_repo->enable_log_filecount) {
+	if (ctx.repo->enable_log_filecount) {
 		html("<th class='right'>Files</th>");
-		if (cgit_repo->enable_log_linecount)
+		if (ctx.repo->enable_log_linecount)
 			html("<th class='right'>Lines</th>");
 	}
 	html("<th class='left'>Author</th></tr>\n");
diff --git a/ui-repolist.c b/ui-repolist.c
index a6cc2cc..5fde174 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -25,7 +25,7 @@ time_t read_agefile(char *path)
 		return 0;
 }
 
-static void print_modtime(struct repoinfo *repo)
+static void print_modtime(struct cgit_repo *repo)
 {
 	char *path;
 	struct stat s;
@@ -70,32 +70,32 @@ void cgit_print_repolist(struct cacheitem *item)
 	html("</tr>\n");
 
 	for (i=0; i<cgit_repolist.count; i++) {
-		cgit_repo = &cgit_repolist.repos[i];
-		if ((last_group == NULL && cgit_repo->group != NULL) ||
-		    (last_group != NULL && cgit_repo->group == NULL) ||
-		    (last_group != NULL && cgit_repo->group != NULL &&
-		     strcmp(cgit_repo->group, last_group))) {
+		ctx.repo = &cgit_repolist.repos[i];
+		if ((last_group == NULL && ctx.repo->group != NULL) ||
+		    (last_group != NULL && ctx.repo->group == NULL) ||
+		    (last_group != NULL && ctx.repo->group != NULL &&
+		     strcmp(ctx.repo->group, last_group))) {
 			htmlf("<tr class='nohover'><td colspan='%d' class='repogroup'>",
 			      columns);
-			html_txt(cgit_repo->group);
+			html_txt(ctx.repo->group);
 			html("</td></tr>");
-			last_group = cgit_repo->group;
+			last_group = ctx.repo->group;
 		}
 		htmlf("<tr><td class='%s'>",
-		      cgit_repo->group ? "sublevel-repo" : "toplevel-repo");
-		html_link_open(cgit_repourl(cgit_repo->url), NULL, NULL);
-		html_txt(cgit_repo->name);
+		      ctx.repo->group ? "sublevel-repo" : "toplevel-repo");
+		html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL);
+		html_txt(ctx.repo->name);
 		html_link_close();
 		html("</td><td>");
-		html_ntxt(ctx.cfg.max_repodesc_len, cgit_repo->desc);
+		html_ntxt(ctx.cfg.max_repodesc_len, ctx.repo->desc);
 		html("</td><td>");
-		html_txt(cgit_repo->owner);
+		html_txt(ctx.repo->owner);
 		html("</td><td>");
-		print_modtime(cgit_repo);
+		print_modtime(ctx.repo);
 		html("</td>");
 		if (ctx.cfg.enable_index_links) {
 			html("<td>");
-			html_link_open(cgit_repourl(cgit_repo->url),
+			html_link_open(cgit_repourl(ctx.repo->url),
 				       NULL, "button");
 			html("summary</a>");
 			cgit_log_link("log", NULL, "button", NULL, NULL, NULL,
diff --git a/ui-shared.c b/ui-shared.c
index b96237d..b9f487a 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -141,8 +141,8 @@ static char *repolink(char *title, char *class, char *page, char *head,
 		html_attr(ctx.cfg.virtual_root);
 		if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/')
 			html("/");
-		html_attr(cgit_repo->url);
-		if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
+		html_attr(ctx.repo->url);
+		if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
 			html("/");
 		if (page) {
 			html(page);
@@ -153,8 +153,8 @@ static char *repolink(char *title, char *class, char *page, char *head,
 	} else {
 		html(ctx.cfg.script_name);
 		html("?url=");
-		html_attr(cgit_repo->url);
-		if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
+		html_attr(ctx.repo->url);
+		if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/')
 			html("/");
 		if (page) {
 			html(page);
@@ -164,7 +164,7 @@ static char *repolink(char *title, char *class, char *page, char *head,
 		}
 		delim = "&amp;";
 	}
-	if (head && strcmp(head, cgit_repo->defbranch)) {
+	if (head && strcmp(head, ctx.repo->defbranch)) {
 		html(delim);
 		html("h=");
 		html_attr(head);
@@ -446,7 +446,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page)
 		html_hidden("url", url);
 	}
 
-	if (incl_head && strcmp(ctx.qry.head, cgit_repo->defbranch))
+	if (incl_head && strcmp(ctx.qry.head, ctx.repo->defbranch))
 		html_hidden("h", ctx.qry.head);
 
 	if (ctx.qry.sha1)
@@ -478,12 +478,12 @@ void cgit_print_pageheader(char *title, int show_search)
 	html("</td></tr>\n<tr><td class='sidebar'>\n");
 	if (ctx.qry.repo) {
 		html("<h1 class='first'>");
-		html_txt(strrpart(cgit_repo->name, 20));
+		html_txt(strrpart(ctx.repo->name, 20));
 		html("</h1>\n");
-		html_txt(cgit_repo->desc);
-		if (cgit_repo->owner) {
+		html_txt(ctx.repo->desc);
+		if (ctx.repo->owner) {
 			html("<h1>owner</h1>\n");
-			html_txt(cgit_repo->owner);
+			html_txt(ctx.repo->owner);
 		}
 		html("<h1>navigate</h1>\n");
 		reporevlink(NULL, "summary", NULL, "menu", ctx.qry.head,
@@ -501,13 +501,13 @@ void cgit_print_pageheader(char *title, int show_search)
 
 		for_each_ref(print_archive_ref, &header);
 
-		if (cgit_repo->clone_url || ctx.cfg.clone_prefix) {
+		if (ctx.repo->clone_url || ctx.cfg.clone_prefix) {
 			html("<h1>clone</h1>\n");
-			if (cgit_repo->clone_url)
-				url = cgit_repo->clone_url;
+			if (ctx.repo->clone_url)
+				url = ctx.repo->clone_url;
 			else
 				url = fmt("%s%s", ctx.cfg.clone_prefix,
-					  cgit_repo->url);
+					  ctx.repo->url);
 			html("<a class='menu' href='");
 			html_attr(url);
 			html("' title='");
diff --git a/ui-summary.c b/ui-summary.c
index 0a44994..3baac08 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -182,9 +182,9 @@ void cgit_print_tags(int maxcount)
 
 void cgit_print_summary()
 {
-	if (cgit_repo->readme) {
+	if (ctx.repo->readme) {
 		html("<div id='summary'>");
-		html_include(cgit_repo->readme);
+		html_include(ctx.repo->readme);
 		html("</div>");
 	}
 	if (ctx.cfg.summary_log > 0)
diff --git a/ui-tree.c b/ui-tree.c
index 7cae85a..df05ad3 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -83,7 +83,7 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen,
 	html("</td><td>");
 	if (S_ISGITLINK(mode)) {
 		htmlf("<a class='ls-mod' href='");
-		html_attr(fmt(cgit_repo->module_link,
+		html_attr(fmt(ctx.repo->module_link,
 			      name,
 			      sha1_to_hex(sha1)));
 		html("'>");
-- 
cgit v1.2.3-54-g00ecf


From b88fb016d0209f7041ac7d3b4d2c077318407a4d Mon Sep 17 00:00:00 2001
From: Lars Hjemli
Date: Sat, 16 Feb 2008 21:16:53 +0100
Subject: Improve initialization of git directory

Using the functions offered by libgit feels like the right thing to do. Also,
make sure that config errors gets properly reported.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
---
 cgit.c      | 17 ++++++++---------
 ui-shared.c |  2 +-
 2 files changed, 9 insertions(+), 10 deletions(-)

(limited to 'cgit.c')

diff --git a/cgit.c b/cgit.c
index b270fdc..2c933dc 100644
--- a/cgit.c
+++ b/cgit.c
@@ -83,20 +83,23 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	char *title, *tmp;
 	int show_search;
 	unsigned char sha1[20];
+	int nongit = 0;
 
-	if (chdir(ctx.repo->path)) {
-		title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
+	setenv("GIT_DIR", ctx.repo->path, 1);
+	setup_git_directory_gently(&nongit);
+	if (nongit) {
+		title = fmt("%s - %s", ctx.cfg.root_title, "config error");
+		tmp = fmt("Not a git repository: '%s'", ctx.repo->path);
+		ctx.repo = NULL;
 		cgit_print_docstart(title, item);
 		cgit_print_pageheader(title, 0);
-		cgit_print_error(fmt("Unable to scan repository: %s",
-				     strerror(errno)));
+		cgit_print_error(tmp);
 		cgit_print_docend();
 		return;
 	}
 
 	title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc);
 	show_search = 0;
-	setenv("GIT_DIR", ctx.repo->path, 1);
 
 	if (!ctx.qry.head) {
 		ctx.qry.head = xstrdup(find_default_branch(ctx.repo));
@@ -179,10 +182,8 @@ static void cgit_print_repo_page(struct cacheitem *item)
 
 static void cgit_fill_cache(struct cacheitem *item, int use_cache)
 {
-	static char buf[PATH_MAX];
 	int stdout2;
 
-	getcwd(buf, sizeof(buf));
 	item->st.st_mtime = time(NULL);
 
 	if (use_cache) {
@@ -203,8 +204,6 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache)
 			     "Restoring original STDOUT");
 		chk_zero(close(stdout2), "Closing temporary STDOUT");
 	}
-
-	chdir(buf);
 }
 
 static void cgit_check_cache(struct cacheitem *item)
diff --git a/ui-shared.c b/ui-shared.c
index b9f487a..cc1ab8b 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -476,7 +476,7 @@ void cgit_print_pageheader(char *title, int show_search)
 	htmlf("'><img src='%s' alt='cgit'/></a>\n",
 	      ctx.cfg.logo);
 	html("</td></tr>\n<tr><td class='sidebar'>\n");
-	if (ctx.qry.repo) {
+	if (ctx.repo) {
 		html("<h1 class='first'>");
 		html_txt(strrpart(ctx.repo->name, 20));
 		html("</h1>\n");
-- 
cgit v1.2.3-54-g00ecf


From b1f9b9c1459cb9a30ebf80721aff6ef788d1f891 Mon Sep 17 00:00:00 2001
From: Lars Hjemli
Date: Sat, 23 Feb 2008 22:45:33 +0100
Subject: Introduce html.h

All html-functions can be quite easily separated from the rest of cgit, so
lets do it; the only issue was html_filemode which uses some git-defined
macros so the function is moved into ui-shared.c::cgit_print_filemode().

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
---
 cgit.c        |  1 -
 cgit.h        | 15 +--------------
 html.c        | 31 ++++++++++++-------------------
 html.h        | 18 ++++++++++++++++++
 shared.c      |  2 --
 ui-blob.c     |  9 +++++++++
 ui-commit.c   |  7 ++++---
 ui-diff.c     |  2 +-
 ui-log.c      |  1 +
 ui-patch.c    |  1 +
 ui-refs.c     |  4 +---
 ui-repolist.c |  3 ++-
 ui-shared.c   | 16 ++++++++++++++++
 ui-snapshot.c |  1 +
 ui-summary.c  |  1 +
 ui-tag.c      |  2 +-
 ui-tree.c     |  3 ++-
 17 files changed, 71 insertions(+), 46 deletions(-)
 create mode 100644 html.h

(limited to 'cgit.c')

diff --git a/cgit.c b/cgit.c
index 2c933dc..e6b4526 100644
--- a/cgit.c
+++ b/cgit.c
@@ -291,7 +291,6 @@ int main(int argc, const char **argv)
 	const char *cgit_config_env = getenv("CGIT_CONFIG");
 
 	cgit_prepare_context(&ctx);
-	htmlfd = STDOUT_FILENO;
 	item.st.st_mtime = time(NULL);
 	cgit_repolist.length = 0;
 	cgit_repolist.count = 0;
diff --git a/cgit.h b/cgit.h
index 598d8c3..5b7ee1c 100644
--- a/cgit.h
+++ b/cgit.h
@@ -186,8 +186,6 @@ extern struct cgit_repolist cgit_repolist;
 extern struct cgit_context ctx;
 extern int cgit_cmd;
 
-extern int htmlfd;
-
 extern void cgit_prepare_context(struct cgit_context *ctx);
 extern int cgit_get_cmd_index(const char *cmd);
 extern struct cgit_repo *cgit_get_repoinfo(const char *url);
@@ -222,18 +220,6 @@ extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);
 
 extern char *fmt(const char *format,...);
 
-extern void html(const char *txt);
-extern void htmlf(const char *format,...);
-extern void html_txt(char *txt);
-extern void html_ntxt(int len, char *txt);
-extern void html_attr(char *txt);
-extern void html_hidden(char *name, char *value);
-extern void html_option(char *value, char *text, char *selected_value);
-extern void html_link_open(char *url, char *title, char *class);
-extern void html_link_close(void);
-extern void html_filemode(unsigned short mode);
-extern int html_include(const char *filename);
-
 extern int cgit_read_config(const char *filename, configfn fn);
 extern int cgit_parse_query(char *txt, configfn fn);
 extern struct commitinfo *cgit_parse_commit(struct commit *commit);
@@ -280,6 +266,7 @@ extern void cgit_print_pageheader(char *title, int show_search);
 extern void cgit_print_snapshot_start(const char *mimetype,
 				      const char *filename,
 				      struct cacheitem *item);
+extern void cgit_print_filemode(unsigned short mode);
 extern void cgit_print_branches(int maxcount);
 extern void cgit_print_tags(int maxcount);
 
diff --git a/html.c b/html.c
index eb163d9..0962e71 100644
--- a/html.c
+++ b/html.c
@@ -6,7 +6,13 @@
  *   (see COPYING for full license text)
  */
 
-#include "cgit.h"
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+int htmlfd = STDOUT_FILENO;
 
 char *fmt(const char *format, ...)
 {
@@ -21,8 +27,10 @@ char *fmt(const char *format, ...)
 	va_start(args, format);
 	len = vsnprintf(buf[bufidx], sizeof(buf[bufidx]), format, args);
 	va_end(args);
-	if (len>sizeof(buf[bufidx]))
-		die("[html.c] string truncated: %s", format);
+	if (len>sizeof(buf[bufidx])) {
+		fprintf(stderr, "[html.c] string truncated: %s\n", format);
+		exit(1);
+	}
 	return buf[bufidx];
 }
 
@@ -160,25 +168,10 @@ void html_link_close(void)
 
 void html_fileperm(unsigned short mode)
 {
-	htmlf("%c%c%c", (mode & 4 ? 'r' : '-'), 
+	htmlf("%c%c%c", (mode & 4 ? 'r' : '-'),
 	      (mode & 2 ? 'w' : '-'), (mode & 1 ? 'x' : '-'));
 }
 
-void html_filemode(unsigned short mode)
-{
-	if (S_ISDIR(mode))
-		html("d");
-	else if (S_ISLNK(mode))
-		html("l");
-	else if (S_ISGITLINK(mode))
-		html("m");
-	else
-		html("-");
-	html_fileperm(mode >> 6);
-	html_fileperm(mode >> 3);
-	html_fileperm(mode);
-}
-
 int html_include(const char *filename)
 {
 	FILE *f;
diff --git a/html.h b/html.h
new file mode 100644
index 0000000..63f4551
--- /dev/null
+++ b/html.h
@@ -0,0 +1,18 @@
+#ifndef HTML_H
+#define HTML_H
+
+extern int htmlfd;
+
+extern void html(const char *txt);
+extern void htmlf(const char *format,...);
+extern void html_txt(char *txt);
+extern void html_ntxt(int len, char *txt);
+extern void html_attr(char *txt);
+extern void html_hidden(char *name, char *value);
+extern void html_option(char *value, char *text, char *selected_value);
+extern void html_link_open(char *url, char *title, char *class);
+extern void html_link_close(void);
+extern void html_fileperm(unsigned short mode);
+extern int html_include(const char *filename);
+
+#endif /* HTML_H */
diff --git a/shared.c b/shared.c
index 808e674..76e10d0 100644
--- a/shared.c
+++ b/shared.c
@@ -14,8 +14,6 @@ int cgit_cmd;
 
 const char *cgit_version = CGIT_VERSION;
 
-int htmlfd = 0;
-
 void cgit_prepare_context(struct cgit_context *ctx)
 {
 	memset(ctx, 0, sizeof(ctx));
diff --git a/ui-blob.c b/ui-blob.c
index f5b844b..be4fb88 100644
--- a/ui-blob.c
+++ b/ui-blob.c
@@ -1,4 +1,13 @@
+/* ui-blob.c: show blob content
+ *
+ * Copyright (C) 2008 Lars Hjemli
+ *
+ * Licensed under GNU General Public License v2
+ *   (see COPYING for full license text)
+ */
+
 #include "cgit.h"
+#include "html.h"
 
 void cgit_print_blob(struct cacheitem *item, const char *hex, char *path)
 {
diff --git a/ui-commit.c b/ui-commit.c
index 25721ca..ed25824 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -7,6 +7,7 @@
  */
 
 #include "cgit.h"
+#include "html.h"
 
 static int files, slots;
 static int total_adds, total_rems, max_changes;
@@ -62,16 +63,16 @@ void print_fileinfo(struct fileinfo *info)
 	html("<tr>");
 	htmlf("<td class='mode'>");
 	if (is_null_sha1(info->new_sha1)) {
-		html_filemode(info->old_mode);
+		cgit_print_filemode(info->old_mode);
 	} else {
-		html_filemode(info->new_mode);
+		cgit_print_filemode(info->new_mode);
 	}
 
 	if (info->old_mode != info->new_mode &&
 	    !is_null_sha1(info->old_sha1) &&
 	    !is_null_sha1(info->new_sha1)) {
 		html("<span class='modechange'>[");
-		html_filemode(info->old_mode);
+		cgit_print_filemode(info->old_mode);
 		html("]</span>");
 	}
 	htmlf("</td><td class='%s'>", class);
diff --git a/ui-diff.c b/ui-diff.c
index 263a7ba..5c3bc98 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -7,7 +7,7 @@
  */
 
 #include "cgit.h"
-
+#include "html.h"
 
 unsigned char old_rev_sha1[20];
 unsigned char new_rev_sha1[20];
diff --git a/ui-log.c b/ui-log.c
index 72e2a4b..e1d324d 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -7,6 +7,7 @@
  */
 
 #include "cgit.h"
+#include "html.h"
 
 int files, add_lines, rem_lines;
 
diff --git a/ui-patch.c b/ui-patch.c
index 1da0a27..d93426b 100644
--- a/ui-patch.c
+++ b/ui-patch.c
@@ -7,6 +7,7 @@
  */
 
 #include "cgit.h"
+#include "html.h"
 
 static void print_line(char *line, int len)
 {
diff --git a/ui-refs.c b/ui-refs.c
index ba513c1..e2a16f4 100644
--- a/ui-refs.c
+++ b/ui-refs.c
@@ -7,9 +7,7 @@
  */
 
 #include "cgit.h"
-
-
-
+#include "html.h"
 
 void cgit_print_refs()
 {
diff --git a/ui-repolist.c b/ui-repolist.c
index 5fde174..cd4e41d 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -6,9 +6,10 @@
  *   (see COPYING for full license text)
  */
 
-#include "cgit.h"
 #include <time.h>
 
+#include "cgit.h"
+#include "html.h"
 
 time_t read_agefile(char *path)
 {
diff --git a/ui-shared.c b/ui-shared.c
index cc1ab8b..2eff79d 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -7,6 +7,7 @@
  */
 
 #include "cgit.h"
+#include "html.h"
 
 const char cgit_doctype[] =
 "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n"
@@ -567,4 +568,19 @@ void cgit_print_snapshot_start(const char *mimetype, const char *filename,
 	html("\n");
 }
 
+void cgit_print_filemode(unsigned short mode)
+{
+	if (S_ISDIR(mode))
+		html("d");
+	else if (S_ISLNK(mode))
+		html("l");
+	else if (S_ISGITLINK(mode))
+		html("m");
+	else
+		html("-");
+	html_fileperm(mode >> 6);
+	html_fileperm(mode >> 3);
+	html_fileperm(mode);
+}
+
 /* vim:set sw=8: */
diff --git a/ui-snapshot.c b/ui-snapshot.c
index dfedd8f..67dbbdd 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -7,6 +7,7 @@
  */
 
 #include "cgit.h"
+#include "html.h"
 
 static int write_compressed_tar_archive(struct archiver_args *args,const char *filter)
 {
diff --git a/ui-summary.c b/ui-summary.c
index 3baac08..0afa0a3 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -7,6 +7,7 @@
  */
 
 #include "cgit.h"
+#include "html.h"
 
 static int header;
 
diff --git a/ui-tag.c b/ui-tag.c
index 6d761f3..2998d02 100644
--- a/ui-tag.c
+++ b/ui-tag.c
@@ -7,7 +7,7 @@
  */
 
 #include "cgit.h"
-
+#include "html.h"
 
 static void print_tag_content(char *buf)
 {
diff --git a/ui-tree.c b/ui-tree.c
index df05ad3..7912784 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -7,6 +7,7 @@
  */
 
 #include "cgit.h"
+#include "html.h"
 
 char *curr_rev;
 char *match_path;
@@ -79,7 +80,7 @@ static int ls_item(const unsigned char *sha1, const char *base, int baselen,
 	}
 
 	html("<tr><td class='ls-mode'>");
-	html_filemode(mode);
+	cgit_print_filemode(mode);
 	html("</td><td>");
 	if (S_ISGITLINK(mode)) {
 		htmlf("<a class='ls-mod' href='");
-- 
cgit v1.2.3-54-g00ecf


From f3c1a187fe2bc33f8423cd535d5045899699995b Mon Sep 17 00:00:00 2001
From: Lars Hjemli
Date: Mon, 24 Mar 2008 00:51:19 +0100
Subject: Add struct cgit_page to cgit_context

This struct is used when generating http headers, and as such is another
small step towards the goal of the whole cleanup series; to invoke each
page/view function with a function pointer.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
---
 cgit.c        |  50 +++++++++++++++++---------
 cgit.h        |  18 +++++++---
 shared.c      |   3 ++
 ui-blob.c     |   4 ++-
 ui-patch.c    |   4 ++-
 ui-repolist.c |   6 ++--
 ui-shared.c   | 112 ++++++++++++++++++++++++++--------------------------------
 ui-snapshot.c |   4 ++-
 8 files changed, 113 insertions(+), 88 deletions(-)

(limited to 'cgit.c')

diff --git a/cgit.c b/cgit.c
index e6b4526..d0f6905 100644
--- a/cgit.c
+++ b/cgit.c
@@ -7,13 +7,16 @@
  */
 
 #include "cgit.h"
+#include "cmd.h"
 
 static int cgit_prepare_cache(struct cacheitem *item)
 {
 	if (!ctx.repo && ctx.qry.repo) {
-		char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
-		cgit_print_docstart(title, item);
-		cgit_print_pageheader(title, 0);
+		ctx.page.title = fmt("%s - %s", ctx.cfg.root_title,
+				      "Bad request");
+		cgit_print_http_headers(&ctx);
+		cgit_print_docstart(&ctx);
+		cgit_print_pageheader(&ctx);
 		cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo));
 		cgit_print_docend();
 		return 0;
@@ -80,7 +83,7 @@ char *find_default_branch(struct cgit_repo *repo)
 
 static void cgit_print_repo_page(struct cacheitem *item)
 {
-	char *title, *tmp;
+	char *tmp;
 	int show_search;
 	unsigned char sha1[20];
 	int nongit = 0;
@@ -88,17 +91,19 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	setenv("GIT_DIR", ctx.repo->path, 1);
 	setup_git_directory_gently(&nongit);
 	if (nongit) {
-		title = fmt("%s - %s", ctx.cfg.root_title, "config error");
+		ctx.page.title = fmt("%s - %s", ctx.cfg.root_title,
+				     "config error");
 		tmp = fmt("Not a git repository: '%s'", ctx.repo->path);
 		ctx.repo = NULL;
-		cgit_print_docstart(title, item);
-		cgit_print_pageheader(title, 0);
+		cgit_print_http_headers(&ctx);
+		cgit_print_docstart(&ctx);
+		cgit_print_pageheader(&ctx);
 		cgit_print_error(tmp);
 		cgit_print_docend();
 		return;
 	}
 
-	title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc);
+	ctx.page.title = fmt("%s - %s", ctx.repo->name, ctx.repo->desc);
 	show_search = 0;
 
 	if (!ctx.qry.head) {
@@ -107,8 +112,9 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	}
 
 	if (!ctx.qry.head) {
-		cgit_print_docstart(title, item);
-		cgit_print_pageheader(title, 0);
+		cgit_print_http_headers(&ctx);
+		cgit_print_docstart(&ctx);
+		cgit_print_pageheader(&ctx);
 		cgit_print_error("Repository seems to be empty");
 		cgit_print_docend();
 		return;
@@ -117,8 +123,9 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	if (get_sha1(ctx.qry.head, sha1)) {
 		tmp = xstrdup(ctx.qry.head);
 		ctx.qry.head = ctx.repo->defbranch;
-		cgit_print_docstart(title, item);
-		cgit_print_pageheader(title, 0);
+		cgit_print_http_headers(&ctx);
+		cgit_print_docstart(&ctx);
+		cgit_print_pageheader(&ctx);
 		cgit_print_error(fmt("Invalid branch: %s", tmp));
 		cgit_print_docend();
 		return;
@@ -143,15 +150,16 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	}
 
 	show_search = (cgit_cmd == CMD_LOG);
-	cgit_print_docstart(title, item);
+	cgit_print_http_headers(&ctx);
+	cgit_print_docstart(&ctx);
 	if (!cgit_cmd) {
-		cgit_print_pageheader("summary", show_search);
+		cgit_print_pageheader(&ctx);
 		cgit_print_summary();
 		cgit_print_docend();
 		return;
 	}
 
-	cgit_print_pageheader(ctx.qry.page, show_search);
+	cgit_print_pageheader(&ctx);
 
 	switch(cgit_cmd) {
 	case CMD_LOG:
@@ -180,12 +188,18 @@ static void cgit_print_repo_page(struct cacheitem *item)
 	cgit_print_docend();
 }
 
+static long ttl_seconds(long ttl)
+{
+	if (ttl<0)
+		return 60 * 60 * 24 * 365;
+	else
+		return ttl * 60;
+}
+
 static void cgit_fill_cache(struct cacheitem *item, int use_cache)
 {
 	int stdout2;
 
-	item->st.st_mtime = time(NULL);
-
 	if (use_cache) {
 		stdout2 = chk_positive(dup(STDOUT_FILENO),
 				       "Preserving STDOUT");
@@ -193,6 +207,8 @@ static void cgit_fill_cache(struct cacheitem *item, int use_cache)
 		chk_positive(dup2(item->fd, STDOUT_FILENO), "Dup2(cachefile)");
 	}
 
+	ctx.page.modified = time(NULL);
+	ctx.page.expires = ctx.page.modified + ttl_seconds(item->ttl);
 	if (ctx.repo)
 		cgit_print_repo_page(item);
 	else
diff --git a/cgit.h b/cgit.h
index 5b7ee1c..8ab8e07 100644
--- a/cgit.h
+++ b/cgit.h
@@ -174,10 +174,20 @@ struct cgit_config {
 	int summary_tags;
 };
 
+struct cgit_page {
+	time_t modified;
+	time_t expires;
+	char *mimetype;
+	char *charset;
+	char *filename;
+	char *title;
+};
+
 struct cgit_context {
 	struct cgit_query qry;
 	struct cgit_config cfg;
 	struct cgit_repo *repo;
+	struct cgit_page page;
 };
 
 extern const char *cgit_version;
@@ -260,12 +270,10 @@ extern void cgit_object_link(struct object *obj);
 extern void cgit_print_error(char *msg);
 extern void cgit_print_date(time_t secs, char *format);
 extern void cgit_print_age(time_t t, time_t max_relative, char *format);
-extern void cgit_print_docstart(char *title, struct cacheitem *item);
+extern void cgit_print_http_headers(struct cgit_context *ctx);
+extern void cgit_print_docstart(struct cgit_context *ctx);
 extern void cgit_print_docend();
-extern void cgit_print_pageheader(char *title, int show_search);
-extern void cgit_print_snapshot_start(const char *mimetype,
-				      const char *filename,
-				      struct cacheitem *item);
+extern void cgit_print_pageheader(struct cgit_context *ctx);
 extern void cgit_print_filemode(unsigned short mode);
 extern void cgit_print_branches(int maxcount);
 extern void cgit_print_tags(int maxcount);
diff --git a/shared.c b/shared.c
index 76e10d0..539d533 100644
--- a/shared.c
+++ b/shared.c
@@ -35,6 +35,9 @@ void cgit_prepare_context(struct cgit_context *ctx)
 	ctx->cfg.robots = "index, nofollow";
 	ctx->cfg.root_title = "Git repository browser";
 	ctx->cfg.script_name = CGIT_SCRIPT_NAME;
+	ctx->page.mimetype = "text/html";
+	ctx->page.charset = PAGE_ENCODING;
+	ctx->page.filename = NULL;
 }
 
 int cgit_get_cmd_index(const char *cmd)
diff --git a/ui-blob.c b/ui-blob.c
index be4fb88..bd44574 100644
--- a/ui-blob.c
+++ b/ui-blob.c
@@ -35,6 +35,8 @@ void cgit_print_blob(struct cacheitem *item, const char *hex, char *path)
 	}
 
 	buf[size] = '\0';
-	cgit_print_snapshot_start("text/plain", path, item);
+	ctx.page.mimetype = "text/plain";
+	ctx.page.filename = path;
+	cgit_print_http_headers(&ctx);
 	write(htmlfd, buf, size);
 }
diff --git a/ui-patch.c b/ui-patch.c
index d93426b..a77f3f6 100644
--- a/ui-patch.c
+++ b/ui-patch.c
@@ -92,7 +92,9 @@ void cgit_print_patch(char *hex, struct cacheitem *item)
 	hashcpy(old_sha1, commit->parents->item->object.sha1);
 
 	patchname = fmt("%s.patch", sha1_to_hex(sha1));
-	cgit_print_snapshot_start("text/plain", patchname, item);
+	ctx.page.mimetype = "text/plain";
+	ctx.page.filename = patchname;
+	cgit_print_http_headers(&ctx);
 	htmlf("From %s Mon Sep 17 00:00:00 2001\n", sha1_to_hex(sha1));
 	htmlf("From: %s%s\n", info->author, info->author_email);
 	html("Date: ");
diff --git a/ui-repolist.c b/ui-repolist.c
index cd4e41d..e663585 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -51,8 +51,10 @@ void cgit_print_repolist(struct cacheitem *item)
 	if (ctx.cfg.enable_index_links)
 		columns++;
 
-	cgit_print_docstart(ctx.cfg.root_title, item);
-	cgit_print_pageheader(ctx.cfg.root_title, 0);
+	ctx.page.title = ctx.cfg.root_title;
+	cgit_print_http_headers(&ctx);
+	cgit_print_docstart(&ctx);
+	cgit_print_pageheader(&ctx);
 
 	html("<table summary='repository list' class='list nowrap'>");
 	if (ctx.cfg.index_header) {
diff --git a/ui-shared.c b/ui-shared.c
index 2eff79d..2596023 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -26,14 +26,6 @@ static char *http_date(time_t t)
 		   tm->tm_hour, tm->tm_min, tm->tm_sec);
 }
 
-static long ttl_seconds(long ttl)
-{
-	if (ttl<0)
-		return 60 * 60 * 24 * 365;
-	else
-		return ttl * 60;
-}
-
 void cgit_print_error(char *msg)
 {
 	html("<div class='error'>");
@@ -361,24 +353,34 @@ void cgit_print_age(time_t t, time_t max_relative, char *format)
 	      secs * 1.0 / TM_YEAR);
 }
 
-void cgit_print_docstart(char *title, struct cacheitem *item)
+void cgit_print_http_headers(struct cgit_context *ctx)
 {
-	html("Content-Type: text/html; charset=" PAGE_ENCODING "\n");
-	htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime));
-	htmlf("Expires: %s\n", http_date(item->st.st_mtime +
-					 ttl_seconds(item->ttl)));
+	if (ctx->page.mimetype && ctx->page.charset)
+		htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype,
+		      ctx->page.charset);
+	else if (ctx->page.mimetype)
+		htmlf("Content-Type: %s\n", ctx->page.mimetype);
+	if (ctx->page.filename)
+		htmlf("Content-Disposition: inline; filename=\"%s\"\n",
+		      ctx->page.filename);
+	htmlf("Last-Modified: %s\n", http_date(ctx->page.modified));
+	htmlf("Expires: %s\n", http_date(ctx->page.expires));
 	html("\n");
+}
+
+void cgit_print_docstart(struct cgit_context *ctx)
+{
 	html(cgit_doctype);
 	html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n");
 	html("<head>\n");
 	html("<title>");
-	html_txt(title);
+	html_txt(ctx->page.title);
 	html("</title>\n");
 	htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version);
-	if (ctx.cfg.robots && *ctx.cfg.robots)
-		htmlf("<meta name='robots' content='%s'/>\n", ctx.cfg.robots);
+	if (ctx->cfg.robots && *ctx->cfg.robots)
+		htmlf("<meta name='robots' content='%s'/>\n", ctx->cfg.robots);
 	html("<link rel='stylesheet' type='text/css' href='");
-	html_attr(ctx.cfg.css);
+	html_attr(ctx->cfg.css);
 	html("'/>\n");
 	html("</head>\n");
 	html("<body>\n");
@@ -463,7 +465,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page)
 	}
 }
 
-void cgit_print_pageheader(char *title, int show_search)
+void cgit_print_pageheader(struct cgit_context *ctx)
 {
 	static const char *default_info = "This is cgit, a fast webinterface for git repositories";
 	int header = 0;
@@ -475,40 +477,40 @@ void cgit_print_pageheader(char *title, int show_search)
 	html("<tr><td class='sidebar'>\n<a href='");
 	html_attr(cgit_rooturl());
 	htmlf("'><img src='%s' alt='cgit'/></a>\n",
-	      ctx.cfg.logo);
+	      ctx->cfg.logo);
 	html("</td></tr>\n<tr><td class='sidebar'>\n");
-	if (ctx.repo) {
+	if (ctx->repo) {
 		html("<h1 class='first'>");
-		html_txt(strrpart(ctx.repo->name, 20));
+		html_txt(strrpart(ctx->repo->name, 20));
 		html("</h1>\n");
-		html_txt(ctx.repo->desc);
-		if (ctx.repo->owner) {
+		html_txt(ctx->repo->desc);
+		if (ctx->repo->owner) {
 			html("<h1>owner</h1>\n");
-			html_txt(ctx.repo->owner);
+			html_txt(ctx->repo->owner);
 		}
 		html("<h1>navigate</h1>\n");
-		reporevlink(NULL, "summary", NULL, "menu", ctx.qry.head,
+		reporevlink(NULL, "summary", NULL, "menu", ctx->qry.head,
 			    NULL, NULL);
-		cgit_log_link("log", NULL, "menu", ctx.qry.head, NULL, NULL,
+		cgit_log_link("log", NULL, "menu", ctx->qry.head, NULL, NULL,
 			      0, NULL, NULL);
-		cgit_tree_link("tree", NULL, "menu", ctx.qry.head,
-			       ctx.qry.sha1, NULL);
-		cgit_commit_link("commit", NULL, "menu", ctx.qry.head,
-			      ctx.qry.sha1);
-		cgit_diff_link("diff", NULL, "menu", ctx.qry.head,
-			       ctx.qry.sha1, ctx.qry.sha2, NULL);
-		cgit_patch_link("patch", NULL, "menu", ctx.qry.head,
-				ctx.qry.sha1);
+		cgit_tree_link("tree", NULL, "menu", ctx->qry.head,
+			       ctx->qry.sha1, NULL);
+		cgit_commit_link("commit", NULL, "menu", ctx->qry.head,
+			      ctx->qry.sha1);
+		cgit_diff_link("diff", NULL, "menu", ctx->qry.head,
+			       ctx->qry.sha1, ctx->qry.sha2, NULL);
+		cgit_patch_link("patch", NULL, "menu", ctx->qry.head,
+				ctx->qry.sha1);
 
 		for_each_ref(print_archive_ref, &header);
 
-		if (ctx.repo->clone_url || ctx.cfg.clone_prefix) {
+		if (ctx->repo->clone_url || ctx->cfg.clone_prefix) {
 			html("<h1>clone</h1>\n");
-			if (ctx.repo->clone_url)
-				url = ctx.repo->clone_url;
+			if (ctx->repo->clone_url)
+				url = ctx->repo->clone_url;
 			else
-				url = fmt("%s%s", ctx.cfg.clone_prefix,
-					  ctx.repo->url);
+				url = fmt("%s%s", ctx->cfg.clone_prefix,
+					  ctx->repo->url);
 			html("<a class='menu' href='");
 			html_attr(url);
 			html("' title='");
@@ -520,10 +522,10 @@ void cgit_print_pageheader(char *title, int show_search)
 
 		html("<h1>branch</h1>\n");
 		html("<form method='get' action=''>\n");
-		add_hidden_formfields(0, 1, ctx.qry.page);
+		add_hidden_formfields(0, 1, ctx->qry.page);
 //		html("<table summary='branch selector' class='grid'><tr><td id='branch-dropdown-cell'>");
 		html("<select name='h' onchange='this.form.submit();'>\n");
-		for_each_branch_ref(print_branch_option, ctx.qry.head);
+		for_each_branch_ref(print_branch_option, ctx->qry.head);
 		html("</select>\n");
 //		html("</td><td>");
 		html("<noscript><input type='submit' id='switch-btn' value='switch'/></noscript>\n");
@@ -532,22 +534,22 @@ void cgit_print_pageheader(char *title, int show_search)
 
 		html("<h1>search</h1>\n");
 		html("<form method='get' action='");
-		if (ctx.cfg.virtual_root)
-			html_attr(cgit_fileurl(ctx.qry.repo, "log",
-					       ctx.qry.path, NULL));
+		if (ctx->cfg.virtual_root)
+			html_attr(cgit_fileurl(ctx->qry.repo, "log",
+					       ctx->qry.path, NULL));
 		html("'>\n");
 		add_hidden_formfields(1, 0, "log");
 		html("<select name='qt'>\n");
-		html_option("grep", "log msg", ctx.qry.grep);
-		html_option("author", "author", ctx.qry.grep);
-		html_option("committer", "committer", ctx.qry.grep);
+		html_option("grep", "log msg", ctx->qry.grep);
+		html_option("author", "author", ctx->qry.grep);
+		html_option("committer", "committer", ctx->qry.grep);
 		html("</select>\n");
 		html("<input class='txt' type='text' name='q' value='");
-		html_attr(ctx.qry.search);
+		html_attr(ctx->qry.search);
 		html("'/>\n");
 		html("</form>\n");
 	} else {
-		if (!ctx.cfg.index_info || html_include(ctx.cfg.index_info))
+		if (!ctx->cfg.index_info || html_include(ctx->cfg.index_info))
 			html(default_info);
 	}
 
@@ -556,18 +558,6 @@ void cgit_print_pageheader(char *title, int show_search)
 	html("<td id='content'>\n");
 }
 
-
-void cgit_print_snapshot_start(const char *mimetype, const char *filename,
-			       struct cacheitem *item)
-{
-	htmlf("Content-Type: %s\n", mimetype);
-	htmlf("Content-Disposition: inline; filename=\"%s\"\n", filename);
-	htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime));
-	htmlf("Expires: %s\n", http_date(item->st.st_mtime +
-					 ttl_seconds(item->ttl)));
-	html("\n");
-}
-
 void cgit_print_filemode(unsigned short mode)
 {
 	if (S_ISDIR(mode))
diff --git a/ui-snapshot.c b/ui-snapshot.c
index 67dbbdd..4449803 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -101,7 +101,9 @@ void cgit_print_snapshot(struct cacheitem *item, const char *head,
 		args.base = fmt("%s/", prefix);
 		args.tree = commit->tree;
 		args.time = commit->date;
-		cgit_print_snapshot_start(sat->mimetype, filename, item);
+		ctx.page.mimetype = xstrdup(sat->mimetype);
+		ctx.page.filename = xstrdup(filename);
+		cgit_print_http_headers(&ctx);
 		(*sat->write_func)(&args);
 		return;
 	}
-- 
cgit v1.2.3-54-g00ecf


From 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.c')

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.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 <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 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.c')

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.c')

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 92908af4558d7362c7deeb05254343a5a5f11a05 Mon Sep 17 00:00:00 2001
From: Lars Hjemli
Date: Mon, 24 Mar 2008 23:10:59 +0100
Subject: Move cgit_version from shared.c to cgit.c

With the matching Makefile change, this makes sure that only cgit.o and cgit
proper needs to be rebuildt when VERSION has been modified.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
---
 Makefile | 4 +++-
 cgit.c   | 2 ++
 shared.c | 2 --
 3 files changed, 5 insertions(+), 3 deletions(-)

(limited to 'cgit.c')

diff --git a/Makefile b/Makefile
index faf7b98..c9be8fa 100644
--- a/Makefile
+++ b/Makefile
@@ -66,7 +66,9 @@ CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"'
 cgit: $(OBJECTS)
 	$(CC) $(CFLAGS) -o cgit $(OBJECTS) $(EXTLIBS)
 
-$(OBJECTS): git/xdiff/lib.a git/libgit.a VERSION
+$(OBJECTS): git/xdiff/lib.a git/libgit.a
+
+cgit.o: VERSION
 
 -include $(OBJECTS:.o=.d)
 
diff --git a/cgit.c b/cgit.c
index b3dd119..3943a0f 100644
--- a/cgit.c
+++ b/cgit.c
@@ -10,6 +10,8 @@
 #include "cmd.h"
 #include "ui-shared.h"
 
+const char *cgit_version = CGIT_VERSION;
+
 void config_cb(const char *name, const char *value)
 {
 	if (!strcmp(name, "root-title"))
diff --git a/shared.c b/shared.c
index cd60da5..48002ac 100644
--- a/shared.c
+++ b/shared.c
@@ -12,8 +12,6 @@ struct cgit_repolist cgit_repolist;
 struct cgit_context ctx;
 int cgit_cmd;
 
-const char *cgit_version = CGIT_VERSION;
-
 int chk_zero(int result, char *msg)
 {
 	if (result != 0)
-- 
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.c')

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.c')

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.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 <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.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


From c6f747649ace1a92ed5dfaae9cc1ea3affe0bf51 Mon Sep 17 00:00:00 2001
From: Lars Hjemli
Date: Tue, 8 Apr 2008 21:27:12 +0200
Subject: Reset ctx.repo to NULL when the config parser is finished

This global variable is used by the config parsing callback to keep track
of the currently configured repository. If it is not reset to NULL when
the config parser is finished, and neither `url` or `r` is specified on the
querystring, cgit will wrongly consider the last configured repo as
selected.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
---
 cgit.c | 1 +
 1 file changed, 1 insertion(+)

(limited to 'cgit.c')

diff --git a/cgit.c b/cgit.c
index 763242a..6ec763f 100644
--- a/cgit.c
+++ b/cgit.c
@@ -440,6 +440,7 @@ int main(int argc, const char **argv)
 
 	parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG,
 			 config_cb);
+	ctx.repo = NULL;
 	if (getenv("SCRIPT_NAME"))
 		ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
 	if (getenv("QUERY_STRING"))
-- 
cgit v1.2.3-54-g00ecf