summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cache.c10
-rw-r--r--cgit.c33
-rw-r--r--cgit.h72
-rw-r--r--shared.c138
-rw-r--r--ui-repolist.c18
-rw-r--r--ui-shared.c60
-rw-r--r--ui-summary.c10
7 files changed, 166 insertions, 175 deletions
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()
44{ 44{
45 char *path; 45 char *path;
46 46
47 path = fmt("%s", cgit_cache_root); 47 path = fmt("%s", ctx.cfg.cache_root);
48 if (mkdir(path, S_IRWXU) && errno!=EEXIST) 48 if (mkdir(path, S_IRWXU) && errno!=EEXIST)
49 return 0; 49 return 0;
50 50
51 if (!cgit_repo) 51 if (!cgit_repo)
52 return 0; 52 return 0;
53 53
54 path = fmt("%s/%s", cgit_cache_root, 54 path = fmt("%s/%s", ctx.cfg.cache_root,
55 cache_safe_filename(cgit_repo->url)); 55 cache_safe_filename(cgit_repo->url));
56 56
57 if (mkdir(path, S_IRWXU) && errno!=EEXIST) 57 if (mkdir(path, S_IRWXU) && errno!=EEXIST)
58 return 0; 58 return 0;
59 59
60 if (ctx.qry.page) { 60 if (ctx.qry.page) {
61 path = fmt("%s/%s/%s", cgit_cache_root, 61 path = fmt("%s/%s/%s", ctx.cfg.cache_root,
62 cache_safe_filename(cgit_repo->url), 62 cache_safe_filename(cgit_repo->url),
63 ctx.qry.page); 63 ctx.qry.page);
64 if (mkdir(path, S_IRWXU) && errno!=EEXIST) 64 if (mkdir(path, S_IRWXU) && errno!=EEXIST)
@@ -74,7 +74,7 @@ int cache_refill_overdue(const char *lockfile)
74 if (stat(lockfile, &st)) 74 if (stat(lockfile, &st))
75 return 0; 75 return 0;
76 else 76 else
77 return (time(NULL) - st.st_mtime > cgit_cache_max_create_time); 77 return (time(NULL) - st.st_mtime > ctx.cfg.cache_max_create_time);
78} 78}
79 79
80int cache_lock(struct cacheitem *item) 80int cache_lock(struct cacheitem *item)
@@ -83,7 +83,7 @@ int cache_lock(struct cacheitem *item)
83 char *lockfile = xstrdup(fmt("%s.lock", item->name)); 83 char *lockfile = xstrdup(fmt("%s.lock", item->name));
84 84
85 top: 85 top:
86 if (++i > cgit_max_lock_attempts) 86 if (++i > ctx.cfg.max_lock_attempts)
87 die("cache_lock: unable to lock %s: %s", 87 die("cache_lock: unable to lock %s: %s",
88 item->name, strerror(errno)); 88 item->name, strerror(errno));
89 89
diff --git a/cgit.c b/cgit.c
index 8a30c3c..f0907a1 100644
--- a/cgit.c
+++ b/cgit.c
@@ -11,7 +11,7 @@
11static int cgit_prepare_cache(struct cacheitem *item) 11static int cgit_prepare_cache(struct cacheitem *item)
12{ 12{
13 if (!cgit_repo && ctx.qry.repo) { 13 if (!cgit_repo && ctx.qry.repo) {
14 char *title = fmt("%s - %s", cgit_root_title, "Bad request"); 14 char *title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
15 cgit_print_docstart(title, item); 15 cgit_print_docstart(title, item);
16 cgit_print_pageheader(title, 0); 16 cgit_print_pageheader(title, 0);
17 cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo)); 17 cgit_print_error(fmt("Unknown repo: %s", ctx.qry.repo));
@@ -20,27 +20,27 @@ static int cgit_prepare_cache(struct cacheitem *item)
20 } 20 }
21 21
22 if (!cgit_repo) { 22 if (!cgit_repo) {
23 item->name = xstrdup(fmt("%s/index.html", cgit_cache_root)); 23 item->name = xstrdup(fmt("%s/index.html", ctx.cfg.cache_root));
24 item->ttl = cgit_cache_root_ttl; 24 item->ttl = ctx.cfg.cache_root_ttl;
25 return 1; 25 return 1;
26 } 26 }
27 27
28 if (!cgit_cmd) { 28 if (!cgit_cmd) {
29 item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root, 29 item->name = xstrdup(fmt("%s/%s/index.%s.html", ctx.cfg.cache_root,
30 cache_safe_filename(cgit_repo->url), 30 cache_safe_filename(cgit_repo->url),
31 cache_safe_filename(ctx.qry.raw))); 31 cache_safe_filename(ctx.qry.raw)));
32 item->ttl = cgit_cache_repo_ttl; 32 item->ttl = ctx.cfg.cache_repo_ttl;
33 } else { 33 } else {
34 item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root, 34 item->name = xstrdup(fmt("%s/%s/%s/%s.html", ctx.cfg.cache_root,
35 cache_safe_filename(cgit_repo->url), 35 cache_safe_filename(cgit_repo->url),
36 ctx.qry.page, 36 ctx.qry.page,
37 cache_safe_filename(ctx.qry.raw))); 37 cache_safe_filename(ctx.qry.raw)));
38 if (ctx.qry.has_symref) 38 if (ctx.qry.has_symref)
39 item->ttl = cgit_cache_dynamic_ttl; 39 item->ttl = ctx.cfg.cache_dynamic_ttl;
40 else if (ctx.qry.has_sha1) 40 else if (ctx.qry.has_sha1)
41 item->ttl = cgit_cache_static_ttl; 41 item->ttl = ctx.cfg.cache_static_ttl;
42 else 42 else
43 item->ttl = cgit_cache_repo_ttl; 43 item->ttl = ctx.cfg.cache_repo_ttl;
44 } 44 }
45 return 1; 45 return 1;
46} 46}
@@ -85,7 +85,7 @@ static void cgit_print_repo_page(struct cacheitem *item)
85 unsigned char sha1[20]; 85 unsigned char sha1[20];
86 86
87 if (chdir(cgit_repo->path)) { 87 if (chdir(cgit_repo->path)) {
88 title = fmt("%s - %s", cgit_root_title, "Bad request"); 88 title = fmt("%s - %s", ctx.cfg.root_title, "Bad request");
89 cgit_print_docstart(title, item); 89 cgit_print_docstart(title, item);
90 cgit_print_pageheader(title, 0); 90 cgit_print_pageheader(title, 0);
91 cgit_print_error(fmt("Unable to scan repository: %s", 91 cgit_print_error(fmt("Unable to scan repository: %s",
@@ -153,7 +153,7 @@ static void cgit_print_repo_page(struct cacheitem *item)
153 switch(cgit_cmd) { 153 switch(cgit_cmd) {
154 case CMD_LOG: 154 case CMD_LOG:
155 cgit_print_log(ctx.qry.sha1, ctx.qry.ofs, 155 cgit_print_log(ctx.qry.sha1, ctx.qry.ofs,
156 cgit_max_commit_count, ctx.qry.grep, ctx.qry.search, 156 ctx.cfg.max_commit_count, ctx.qry.grep, ctx.qry.search,
157 ctx.qry.path, 1); 157 ctx.qry.path, 1);
158 break; 158 break;
159 case CMD_TREE: 159 case CMD_TREE:
@@ -212,7 +212,7 @@ static void cgit_check_cache(struct cacheitem *item)
212 int i = 0; 212 int i = 0;
213 213
214 top: 214 top:
215 if (++i > cgit_max_lock_attempts) { 215 if (++i > ctx.cfg.max_lock_attempts) {
216 die("cgit_refresh_cache: unable to lock %s: %s", 216 die("cgit_refresh_cache: unable to lock %s: %s",
217 item->name, strerror(errno)); 217 item->name, strerror(errno));
218 } 218 }
@@ -258,10 +258,10 @@ static void cgit_parse_args(int argc, const char **argv)
258 258
259 for (i = 1; i < argc; i++) { 259 for (i = 1; i < argc; i++) {
260 if (!strncmp(argv[i], "--cache=", 8)) { 260 if (!strncmp(argv[i], "--cache=", 8)) {
261 cgit_cache_root = xstrdup(argv[i]+8); 261 ctx.cfg.cache_root = xstrdup(argv[i]+8);
262 } 262 }
263 if (!strcmp(argv[i], "--nocache")) { 263 if (!strcmp(argv[i], "--nocache")) {
264 cgit_nocache = 1; 264 ctx.cfg.nocache = 1;
265 } 265 }
266 if (!strncmp(argv[i], "--query=", 8)) { 266 if (!strncmp(argv[i], "--query=", 8)) {
267 ctx.qry.raw = xstrdup(argv[i]+8); 267 ctx.qry.raw = xstrdup(argv[i]+8);
@@ -291,6 +291,7 @@ int main(int argc, const char **argv)
291 struct cacheitem item; 291 struct cacheitem item;
292 const char *cgit_config_env = getenv("CGIT_CONFIG"); 292 const char *cgit_config_env = getenv("CGIT_CONFIG");
293 293
294 cgit_prepare_context(&ctx);
294 htmlfd = STDOUT_FILENO; 295 htmlfd = STDOUT_FILENO;
295 item.st.st_mtime = time(NULL); 296 item.st.st_mtime = time(NULL);
296 cgit_repolist.length = 0; 297 cgit_repolist.length = 0;
@@ -301,14 +302,14 @@ int main(int argc, const char **argv)
301 cgit_global_config_cb); 302 cgit_global_config_cb);
302 cgit_repo = NULL; 303 cgit_repo = NULL;
303 if (getenv("SCRIPT_NAME")) 304 if (getenv("SCRIPT_NAME"))
304 cgit_script_name = xstrdup(getenv("SCRIPT_NAME")); 305 ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
305 if (getenv("QUERY_STRING")) 306 if (getenv("QUERY_STRING"))
306 ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); 307 ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
307 cgit_parse_args(argc, argv); 308 cgit_parse_args(argc, argv);
308 cgit_parse_query(ctx.qry.raw, cgit_querystring_cb); 309 cgit_parse_query(ctx.qry.raw, cgit_querystring_cb);
309 if (!cgit_prepare_cache(&item)) 310 if (!cgit_prepare_cache(&item))
310 return 0; 311 return 0;
311 if (cgit_nocache) { 312 if (ctx.cfg.nocache) {
312 cgit_fill_cache(&item, 0); 313 cgit_fill_cache(&item, 0);
313 } else { 314 } else {
314 cgit_check_cache(&item); 315 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 {
139 int ofs; 139 int ofs;
140}; 140};
141 141
142struct cgit_config {
143 char *agefile;
144 char *cache_root;
145 char *clone_prefix;
146 char *css;
147 char *index_header;
148 char *index_info;
149 char *logo;
150 char *logo_link;
151 char *module_link;
152 char *repo_group;
153 char *robots;
154 char *root_title;
155 char *script_name;
156 char *virtual_root;
157 int cache_dynamic_ttl;
158 int cache_max_create_time;
159 int cache_repo_ttl;
160 int cache_root_ttl;
161 int cache_static_ttl;
162 int enable_index_links;
163 int enable_log_filecount;
164 int enable_log_linecount;
165 int max_commit_count;
166 int max_lock_attempts;
167 int max_msg_len;
168 int max_repodesc_len;
169 int nocache;
170 int renamelimit;
171 int snapshots;
172 int summary_branches;
173 int summary_log;
174 int summary_tags;
175};
176
142struct cgit_context { 177struct cgit_context {
143 struct cgit_query qry; 178 struct cgit_query qry;
179 struct cgit_config cfg;
144}; 180};
145 181
146extern const char *cgit_version; 182extern const char *cgit_version;
@@ -150,43 +186,9 @@ extern struct repoinfo *cgit_repo;
150extern struct cgit_context ctx; 186extern struct cgit_context ctx;
151extern int cgit_cmd; 187extern int cgit_cmd;
152 188
153extern char *cgit_root_title;
154extern char *cgit_css;
155extern char *cgit_logo;
156extern char *cgit_index_header;
157extern char *cgit_index_info;
158extern char *cgit_logo_link;
159extern char *cgit_module_link;
160extern char *cgit_agefile;
161extern char *cgit_virtual_root;
162extern char *cgit_script_name;
163extern char *cgit_cache_root;
164extern char *cgit_repo_group;
165extern char *cgit_robots;
166extern char *cgit_clone_prefix;
167
168extern int cgit_nocache;
169extern int cgit_snapshots;
170extern int cgit_enable_index_links;
171extern int cgit_enable_log_filecount;
172extern int cgit_enable_log_linecount;
173extern int cgit_max_lock_attempts;
174extern int cgit_cache_root_ttl;
175extern int cgit_cache_repo_ttl;
176extern int cgit_cache_dynamic_ttl;
177extern int cgit_cache_static_ttl;
178extern int cgit_cache_max_create_time;
179extern int cgit_summary_log;
180extern int cgit_summary_tags;
181extern int cgit_summary_branches;
182
183extern int cgit_max_msg_len;
184extern int cgit_max_repodesc_len;
185extern int cgit_max_commit_count;
186
187
188extern int htmlfd; 189extern int htmlfd;
189 190
191extern void cgit_prepare_context(struct cgit_context *ctx);
190extern int cgit_get_cmd_index(const char *cmd); 192extern int cgit_get_cmd_index(const char *cmd);
191extern struct repoinfo *cgit_get_repoinfo(const char *url); 193extern struct repoinfo *cgit_get_repoinfo(const char *url);
192extern void cgit_global_config_cb(const char *name, const char *value); 194extern 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;
15 15
16const char *cgit_version = CGIT_VERSION; 16const char *cgit_version = CGIT_VERSION;
17 17
18char *cgit_root_title = "Git repository browser";
19char *cgit_css = "/cgit.css";
20char *cgit_logo = "/git-logo.png";
21char *cgit_index_header = NULL;
22char *cgit_index_info = NULL;
23char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/";
24char *cgit_module_link = "./?repo=%s&page=commit&id=%s";
25char *cgit_agefile = "info/web/last-modified";
26char *cgit_virtual_root = NULL;
27char *cgit_script_name = CGIT_SCRIPT_NAME;
28char *cgit_cache_root = CGIT_CACHE_ROOT;
29char *cgit_repo_group = NULL;
30char *cgit_robots = "index, nofollow";
31char *cgit_clone_prefix = NULL;
32
33int cgit_nocache = 0;
34int cgit_snapshots = 0;
35int cgit_enable_index_links = 0;
36int cgit_enable_log_filecount = 0;
37int cgit_enable_log_linecount = 0;
38int cgit_max_lock_attempts = 5;
39int cgit_cache_root_ttl = 5;
40int cgit_cache_repo_ttl = 5;
41int cgit_cache_dynamic_ttl = 5;
42int cgit_cache_static_ttl = -1;
43int cgit_cache_max_create_time = 5;
44int cgit_summary_log = 0;
45int cgit_summary_tags = 0;
46int cgit_summary_branches = 0;
47int cgit_renamelimit = -1;
48
49int cgit_max_msg_len = 60;
50int cgit_max_repodesc_len = 60;
51int cgit_max_commit_count = 50;
52
53int htmlfd = 0; 18int htmlfd = 0;
54 19
20void cgit_prepare_context(struct cgit_context *ctx)
21{
22 memset(ctx, 0, sizeof(ctx));
23 ctx->cfg.agefile = "info/web/last-modified";
24 ctx->cfg.cache_dynamic_ttl = 5;
25 ctx->cfg.cache_max_create_time = 5;
26 ctx->cfg.cache_repo_ttl = 5;
27 ctx->cfg.cache_root = CGIT_CACHE_ROOT;
28 ctx->cfg.cache_root_ttl = 5;
29 ctx->cfg.cache_static_ttl = -1;
30 ctx->cfg.css = "/cgit.css";
31 ctx->cfg.logo = "/git-logo.png";
32 ctx->cfg.max_commit_count = 50;
33 ctx->cfg.max_lock_attempts = 5;
34 ctx->cfg.max_msg_len = 60;
35 ctx->cfg.max_repodesc_len = 60;
36 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
37 ctx->cfg.renamelimit = -1;
38 ctx->cfg.robots = "index, nofollow";
39 ctx->cfg.root_title = "Git repository browser";
40 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
41}
42
55int cgit_get_cmd_index(const char *cmd) 43int cgit_get_cmd_index(const char *cmd)
56{ 44{
57 static char *cmds[] = {"log", "commit", "diff", "tree", "blob", 45 static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
@@ -105,12 +93,12 @@ struct repoinfo *add_repo(const char *url)
105 ret->path = NULL; 93 ret->path = NULL;
106 ret->desc = "[no description]"; 94 ret->desc = "[no description]";
107 ret->owner = NULL; 95 ret->owner = NULL;
108 ret->group = cgit_repo_group; 96 ret->group = ctx.cfg.repo_group;
109 ret->defbranch = "master"; 97 ret->defbranch = "master";
110 ret->snapshots = cgit_snapshots; 98 ret->snapshots = ctx.cfg.snapshots;
111 ret->enable_log_filecount = cgit_enable_log_filecount; 99 ret->enable_log_filecount = ctx.cfg.enable_log_filecount;
112 ret->enable_log_linecount = cgit_enable_log_linecount; 100 ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
113 ret->module_link = cgit_module_link; 101 ret->module_link = ctx.cfg.module_link;
114 ret->readme = NULL; 102 ret->readme = NULL;
115 return ret; 103 return ret;
116} 104}
@@ -131,65 +119,65 @@ struct repoinfo *cgit_get_repoinfo(const char *url)
131void cgit_global_config_cb(const char *name, const char *value) 119void cgit_global_config_cb(const char *name, const char *value)
132{ 120{
133 if (!strcmp(name, "root-title")) 121 if (!strcmp(name, "root-title"))
134 cgit_root_title = xstrdup(value); 122 ctx.cfg.root_title = xstrdup(value);
135 else if (!strcmp(name, "css")) 123 else if (!strcmp(name, "css"))
136 cgit_css = xstrdup(value); 124 ctx.cfg.css = xstrdup(value);
137 else if (!strcmp(name, "logo")) 125 else if (!strcmp(name, "logo"))
138 cgit_logo = xstrdup(value); 126 ctx.cfg.logo = xstrdup(value);
139 else if (!strcmp(name, "index-header")) 127 else if (!strcmp(name, "index-header"))
140 cgit_index_header = xstrdup(value); 128 ctx.cfg.index_header = xstrdup(value);
141 else if (!strcmp(name, "index-info")) 129 else if (!strcmp(name, "index-info"))
142 cgit_index_info = xstrdup(value); 130 ctx.cfg.index_info = xstrdup(value);
143 else if (!strcmp(name, "logo-link")) 131 else if (!strcmp(name, "logo-link"))
144 cgit_logo_link = xstrdup(value); 132 ctx.cfg.logo_link = xstrdup(value);
145 else if (!strcmp(name, "module-link")) 133 else if (!strcmp(name, "module-link"))
146 cgit_module_link = xstrdup(value); 134 ctx.cfg.module_link = xstrdup(value);
147 else if (!strcmp(name, "virtual-root")) { 135 else if (!strcmp(name, "virtual-root")) {
148 cgit_virtual_root = trim_end(value, '/'); 136 ctx.cfg.virtual_root = trim_end(value, '/');
149 if (!cgit_virtual_root && (!strcmp(value, "/"))) 137 if (!ctx.cfg.virtual_root && (!strcmp(value, "/")))
150 cgit_virtual_root = ""; 138 ctx.cfg.virtual_root = "";
151 } else if (!strcmp(name, "nocache")) 139 } else if (!strcmp(name, "nocache"))
152 cgit_nocache = atoi(value); 140 ctx.cfg.nocache = atoi(value);
153 else if (!strcmp(name, "snapshots")) 141 else if (!strcmp(name, "snapshots"))
154 cgit_snapshots = cgit_parse_snapshots_mask(value); 142 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
155 else if (!strcmp(name, "enable-index-links")) 143 else if (!strcmp(name, "enable-index-links"))
156 cgit_enable_index_links = atoi(value); 144 ctx.cfg.enable_index_links = atoi(value);
157 else if (!strcmp(name, "enable-log-filecount")) 145 else if (!strcmp(name, "enable-log-filecount"))
158 cgit_enable_log_filecount = atoi(value); 146 ctx.cfg.enable_log_filecount = atoi(value);
159 else if (!strcmp(name, "enable-log-linecount")) 147 else if (!strcmp(name, "enable-log-linecount"))
160 cgit_enable_log_linecount = atoi(value); 148 ctx.cfg.enable_log_linecount = atoi(value);
161 else if (!strcmp(name, "cache-root")) 149 else if (!strcmp(name, "cache-root"))
162 cgit_cache_root = xstrdup(value); 150 ctx.cfg.cache_root = xstrdup(value);
163 else if (!strcmp(name, "cache-root-ttl")) 151 else if (!strcmp(name, "cache-root-ttl"))
164 cgit_cache_root_ttl = atoi(value); 152 ctx.cfg.cache_root_ttl = atoi(value);
165 else if (!strcmp(name, "cache-repo-ttl")) 153 else if (!strcmp(name, "cache-repo-ttl"))
166 cgit_cache_repo_ttl = atoi(value); 154 ctx.cfg.cache_repo_ttl = atoi(value);
167 else if (!strcmp(name, "cache-static-ttl")) 155 else if (!strcmp(name, "cache-static-ttl"))
168 cgit_cache_static_ttl = atoi(value); 156 ctx.cfg.cache_static_ttl = atoi(value);
169 else if (!strcmp(name, "cache-dynamic-ttl")) 157 else if (!strcmp(name, "cache-dynamic-ttl"))
170 cgit_cache_dynamic_ttl = atoi(value); 158 ctx.cfg.cache_dynamic_ttl = atoi(value);
171 else if (!strcmp(name, "max-message-length")) 159 else if (!strcmp(name, "max-message-length"))
172 cgit_max_msg_len = atoi(value); 160 ctx.cfg.max_msg_len = atoi(value);
173 else if (!strcmp(name, "max-repodesc-length")) 161 else if (!strcmp(name, "max-repodesc-length"))
174 cgit_max_repodesc_len = atoi(value); 162 ctx.cfg.max_repodesc_len = atoi(value);
175 else if (!strcmp(name, "max-commit-count")) 163 else if (!strcmp(name, "max-commit-count"))
176 cgit_max_commit_count = atoi(value); 164 ctx.cfg.max_commit_count = atoi(value);
177 else if (!strcmp(name, "summary-log")) 165 else if (!strcmp(name, "summary-log"))
178 cgit_summary_log = atoi(value); 166 ctx.cfg.summary_log = atoi(value);
179 else if (!strcmp(name, "summary-branches")) 167 else if (!strcmp(name, "summary-branches"))
180 cgit_summary_branches = atoi(value); 168 ctx.cfg.summary_branches = atoi(value);
181 else if (!strcmp(name, "summary-tags")) 169 else if (!strcmp(name, "summary-tags"))
182 cgit_summary_tags = atoi(value); 170 ctx.cfg.summary_tags = atoi(value);
183 else if (!strcmp(name, "agefile")) 171 else if (!strcmp(name, "agefile"))
184 cgit_agefile = xstrdup(value); 172 ctx.cfg.agefile = xstrdup(value);
185 else if (!strcmp(name, "renamelimit")) 173 else if (!strcmp(name, "renamelimit"))
186 cgit_renamelimit = atoi(value); 174 ctx.cfg.renamelimit = atoi(value);
187 else if (!strcmp(name, "robots")) 175 else if (!strcmp(name, "robots"))
188 cgit_robots = xstrdup(value); 176 ctx.cfg.robots = xstrdup(value);
189 else if (!strcmp(name, "clone-prefix")) 177 else if (!strcmp(name, "clone-prefix"))
190 cgit_clone_prefix = xstrdup(value); 178 ctx.cfg.clone_prefix = xstrdup(value);
191 else if (!strcmp(name, "repo.group")) 179 else if (!strcmp(name, "repo.group"))
192 cgit_repo_group = xstrdup(value); 180 ctx.cfg.repo_group = xstrdup(value);
193 else if (!strcmp(name, "repo.url")) 181 else if (!strcmp(name, "repo.url"))
194 cgit_repo = add_repo(value); 182 cgit_repo = add_repo(value);
195 else if (!strcmp(name, "repo.name")) 183 else if (!strcmp(name, "repo.name"))
@@ -205,11 +193,11 @@ void cgit_global_config_cb(const char *name, const char *value)
205 else if (cgit_repo && !strcmp(name, "repo.defbranch")) 193 else if (cgit_repo && !strcmp(name, "repo.defbranch"))
206 cgit_repo->defbranch = xstrdup(value); 194 cgit_repo->defbranch = xstrdup(value);
207 else if (cgit_repo && !strcmp(name, "repo.snapshots")) 195 else if (cgit_repo && !strcmp(name, "repo.snapshots"))
208 cgit_repo->snapshots = cgit_snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */ 196 cgit_repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
209 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount")) 197 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
210 cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value); 198 cgit_repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
211 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount")) 199 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
212 cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value); 200 cgit_repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
213 else if (cgit_repo && !strcmp(name, "repo.module-link")) 201 else if (cgit_repo && !strcmp(name, "repo.module-link"))
214 cgit_repo->module_link= xstrdup(value); 202 cgit_repo->module_link= xstrdup(value);
215 else if (cgit_repo && !strcmp(name, "repo.readme") && value != NULL) { 203 else if (cgit_repo && !strcmp(name, "repo.readme") && value != NULL) {
@@ -476,7 +464,7 @@ void cgit_diff_tree(const unsigned char *old_sha1,
476 diff_setup(&opt); 464 diff_setup(&opt);
477 opt.output_format = DIFF_FORMAT_CALLBACK; 465 opt.output_format = DIFF_FORMAT_CALLBACK;
478 opt.detect_rename = 1; 466 opt.detect_rename = 1;
479 opt.rename_limit = cgit_renamelimit; 467 opt.rename_limit = ctx.cfg.renamelimit;
480 DIFF_OPT_SET(&opt, RECURSIVE); 468 DIFF_OPT_SET(&opt, RECURSIVE);
481 opt.format_callback = cgit_diff_tree_cb; 469 opt.format_callback = cgit_diff_tree_cb;
482 opt.format_callback_data = fn; 470 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)
30 char *path; 30 char *path;
31 struct stat s; 31 struct stat s;
32 32
33 path = fmt("%s/%s", repo->path, cgit_agefile); 33 path = fmt("%s/%s", repo->path, ctx.cfg.agefile);
34 if (stat(path, &s) == 0) { 34 if (stat(path, &s) == 0) {
35 cgit_print_age(read_agefile(path), -1, NULL); 35 cgit_print_age(read_agefile(path), -1, NULL);
36 return; 36 return;
@@ -47,17 +47,17 @@ void cgit_print_repolist(struct cacheitem *item)
47 int i, columns = 4; 47 int i, columns = 4;
48 char *last_group = NULL; 48 char *last_group = NULL;
49 49
50 if (cgit_enable_index_links) 50 if (ctx.cfg.enable_index_links)
51 columns++; 51 columns++;
52 52
53 cgit_print_docstart(cgit_root_title, item); 53 cgit_print_docstart(ctx.cfg.root_title, item);
54 cgit_print_pageheader(cgit_root_title, 0); 54 cgit_print_pageheader(ctx.cfg.root_title, 0);
55 55
56 html("<table summary='repository list' class='list nowrap'>"); 56 html("<table summary='repository list' class='list nowrap'>");
57 if (cgit_index_header) { 57 if (ctx.cfg.index_header) {
58 htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>", 58 htmlf("<tr class='nohover'><td colspan='%d' class='include-block'>",
59 columns); 59 columns);
60 html_include(cgit_index_header); 60 html_include(ctx.cfg.index_header);
61 html("</td></tr>"); 61 html("</td></tr>");
62 } 62 }
63 html("<tr class='nohover'>" 63 html("<tr class='nohover'>"
@@ -65,7 +65,7 @@ void cgit_print_repolist(struct cacheitem *item)
65 "<th class='left'>Description</th>" 65 "<th class='left'>Description</th>"
66 "<th class='left'>Owner</th>" 66 "<th class='left'>Owner</th>"
67 "<th class='left'>Idle</th>"); 67 "<th class='left'>Idle</th>");
68 if (cgit_enable_index_links) 68 if (ctx.cfg.enable_index_links)
69 html("<th>Links</th>"); 69 html("<th>Links</th>");
70 html("</tr>\n"); 70 html("</tr>\n");
71 71
@@ -87,13 +87,13 @@ void cgit_print_repolist(struct cacheitem *item)
87 html_txt(cgit_repo->name); 87 html_txt(cgit_repo->name);
88 html_link_close(); 88 html_link_close();
89 html("</td><td>"); 89 html("</td><td>");
90 html_ntxt(cgit_max_repodesc_len, cgit_repo->desc); 90 html_ntxt(ctx.cfg.max_repodesc_len, cgit_repo->desc);
91 html("</td><td>"); 91 html("</td><td>");
92 html_txt(cgit_repo->owner); 92 html_txt(cgit_repo->owner);
93 html("</td><td>"); 93 html("</td><td>");
94 print_modtime(cgit_repo); 94 print_modtime(cgit_repo);
95 html("</td>"); 95 html("</td>");
96 if (cgit_enable_index_links) { 96 if (ctx.cfg.enable_index_links) {
97 html("<td>"); 97 html("<td>");
98 html_link_open(cgit_repourl(cgit_repo->url), 98 html_link_open(cgit_repourl(cgit_repo->url),
99 NULL, "button"); 99 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)
42 42
43char *cgit_rooturl() 43char *cgit_rooturl()
44{ 44{
45 if (cgit_virtual_root) 45 if (ctx.cfg.virtual_root)
46 return fmt("%s/", cgit_virtual_root); 46 return fmt("%s/", ctx.cfg.virtual_root);
47 else 47 else
48 return cgit_script_name; 48 return ctx.cfg.script_name;
49} 49}
50 50
51char *cgit_repourl(const char *reponame) 51char *cgit_repourl(const char *reponame)
52{ 52{
53 if (cgit_virtual_root) { 53 if (ctx.cfg.virtual_root) {
54 return fmt("%s/%s/", cgit_virtual_root, reponame); 54 return fmt("%s/%s/", ctx.cfg.virtual_root, reponame);
55 } else { 55 } else {
56 return fmt("?r=%s", reponame); 56 return fmt("?r=%s", reponame);
57 } 57 }
@@ -63,8 +63,8 @@ char *cgit_fileurl(const char *reponame, const char *pagename,
63 char *tmp; 63 char *tmp;
64 char *delim; 64 char *delim;
65 65
66 if (cgit_virtual_root) { 66 if (ctx.cfg.virtual_root) {
67 tmp = fmt("%s/%s/%s/%s", cgit_virtual_root, reponame, 67 tmp = fmt("%s/%s/%s/%s", ctx.cfg.virtual_root, reponame,
68 pagename, (filename ? filename:"")); 68 pagename, (filename ? filename:""));
69 delim = "?"; 69 delim = "?";
70 } else { 70 } else {
@@ -110,14 +110,14 @@ const char *cgit_repobasename(const char *reponame)
110 110
111char *cgit_currurl() 111char *cgit_currurl()
112{ 112{
113 if (!cgit_virtual_root) 113 if (!ctx.cfg.virtual_root)
114 return cgit_script_name; 114 return ctx.cfg.script_name;
115 else if (ctx.qry.page) 115 else if (ctx.qry.page)
116 return fmt("%s/%s/%s/", cgit_virtual_root, ctx.qry.repo, ctx.qry.page); 116 return fmt("%s/%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo, ctx.qry.page);
117 else if (ctx.qry.repo) 117 else if (ctx.qry.repo)
118 return fmt("%s/%s/", cgit_virtual_root, ctx.qry.repo); 118 return fmt("%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo);
119 else 119 else
120 return fmt("%s/", cgit_virtual_root); 120 return fmt("%s/", ctx.cfg.virtual_root);
121} 121}
122 122
123static char *repolink(char *title, char *class, char *page, char *head, 123static 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,
137 html("'"); 137 html("'");
138 } 138 }
139 html(" href='"); 139 html(" href='");
140 if (cgit_virtual_root) { 140 if (ctx.cfg.virtual_root) {
141 html_attr(cgit_virtual_root); 141 html_attr(ctx.cfg.virtual_root);
142 if (cgit_virtual_root[strlen(cgit_virtual_root) - 1] != '/') 142 if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/')
143 html("/"); 143 html("/");
144 html_attr(cgit_repo->url); 144 html_attr(cgit_repo->url);
145 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') 145 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/')
@@ -151,7 +151,7 @@ static char *repolink(char *title, char *class, char *page, char *head,
151 html_attr(path); 151 html_attr(path);
152 } 152 }
153 } else { 153 } else {
154 html(cgit_script_name); 154 html(ctx.cfg.script_name);
155 html("?url="); 155 html("?url=");
156 html_attr(cgit_repo->url); 156 html_attr(cgit_repo->url);
157 if (cgit_repo->url[strlen(cgit_repo->url) - 1] != '/') 157 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,
229void cgit_commit_link(char *name, char *title, char *class, char *head, 229void cgit_commit_link(char *name, char *title, char *class, char *head,
230 char *rev) 230 char *rev)
231{ 231{
232 if (strlen(name) > cgit_max_msg_len && cgit_max_msg_len >= 15) { 232 if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) {
233 name[cgit_max_msg_len] = '\0'; 233 name[ctx.cfg.max_msg_len] = '\0';
234 name[cgit_max_msg_len - 1] = '.'; 234 name[ctx.cfg.max_msg_len - 1] = '.';
235 name[cgit_max_msg_len - 2] = '.'; 235 name[ctx.cfg.max_msg_len - 2] = '.';
236 name[cgit_max_msg_len - 3] = '.'; 236 name[ctx.cfg.max_msg_len - 3] = '.';
237 } 237 }
238 reporevlink("commit", name, title, class, head, rev, NULL); 238 reporevlink("commit", name, title, class, head, rev, NULL);
239} 239}
@@ -374,10 +374,10 @@ void cgit_print_docstart(char *title, struct cacheitem *item)
374 html_txt(title); 374 html_txt(title);
375 html("</title>\n"); 375 html("</title>\n");
376 htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); 376 htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version);
377 if (cgit_robots && *cgit_robots) 377 if (ctx.cfg.robots && *ctx.cfg.robots)
378 htmlf("<meta name='robots' content='%s'/>\n", cgit_robots); 378 htmlf("<meta name='robots' content='%s'/>\n", ctx.cfg.robots);
379 html("<link rel='stylesheet' type='text/css' href='"); 379 html("<link rel='stylesheet' type='text/css' href='");
380 html_attr(cgit_css); 380 html_attr(ctx.cfg.css);
381 html("'/>\n"); 381 html("'/>\n");
382 html("</head>\n"); 382 html("</head>\n");
383 html("<body>\n"); 383 html("<body>\n");
@@ -439,7 +439,7 @@ void add_hidden_formfields(int incl_head, int incl_search, char *page)
439{ 439{
440 char *url; 440 char *url;
441 441
442 if (!cgit_virtual_root) { 442 if (!ctx.cfg.virtual_root) {
443 url = fmt("%s/%s", ctx.qry.repo, page); 443 url = fmt("%s/%s", ctx.qry.repo, page);
444 if (ctx.qry.path) 444 if (ctx.qry.path)
445 url = fmt("%s/%s", url, ctx.qry.path); 445 url = fmt("%s/%s", url, ctx.qry.path);
@@ -474,7 +474,7 @@ void cgit_print_pageheader(char *title, int show_search)
474 html("<tr><td class='sidebar'>\n<a href='"); 474 html("<tr><td class='sidebar'>\n<a href='");
475 html_attr(cgit_rooturl()); 475 html_attr(cgit_rooturl());
476 htmlf("'><img src='%s' alt='cgit'/></a>\n", 476 htmlf("'><img src='%s' alt='cgit'/></a>\n",
477 cgit_logo); 477 ctx.cfg.logo);
478 html("</td></tr>\n<tr><td class='sidebar'>\n"); 478 html("</td></tr>\n<tr><td class='sidebar'>\n");
479 if (ctx.qry.repo) { 479 if (ctx.qry.repo) {
480 html("<h1 class='first'>"); 480 html("<h1 class='first'>");
@@ -501,12 +501,12 @@ void cgit_print_pageheader(char *title, int show_search)
501 501
502 for_each_ref(print_archive_ref, &header); 502 for_each_ref(print_archive_ref, &header);
503 503
504 if (cgit_repo->clone_url || cgit_clone_prefix) { 504 if (cgit_repo->clone_url || ctx.cfg.clone_prefix) {
505 html("<h1>clone</h1>\n"); 505 html("<h1>clone</h1>\n");
506 if (cgit_repo->clone_url) 506 if (cgit_repo->clone_url)
507 url = cgit_repo->clone_url; 507 url = cgit_repo->clone_url;
508 else 508 else
509 url = fmt("%s%s", cgit_clone_prefix, 509 url = fmt("%s%s", ctx.cfg.clone_prefix,
510 cgit_repo->url); 510 cgit_repo->url);
511 html("<a class='menu' href='"); 511 html("<a class='menu' href='");
512 html_attr(url); 512 html_attr(url);
@@ -531,7 +531,7 @@ void cgit_print_pageheader(char *title, int show_search)
531 531
532 html("<h1>search</h1>\n"); 532 html("<h1>search</h1>\n");
533 html("<form method='get' action='"); 533 html("<form method='get' action='");
534 if (cgit_virtual_root) 534 if (ctx.cfg.virtual_root)
535 html_attr(cgit_fileurl(ctx.qry.repo, "log", 535 html_attr(cgit_fileurl(ctx.qry.repo, "log",
536 ctx.qry.path, NULL)); 536 ctx.qry.path, NULL));
537 html("'>\n"); 537 html("'>\n");
@@ -546,7 +546,7 @@ void cgit_print_pageheader(char *title, int show_search)
546 html("'/>\n"); 546 html("'/>\n");
547 html("</form>\n"); 547 html("</form>\n");
548 } else { 548 } else {
549 if (!cgit_index_info || html_include(cgit_index_info)) 549 if (!ctx.cfg.index_info || html_include(ctx.cfg.index_info))
550 html(default_info); 550 html(default_info);
551 } 551 }
552 552
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()
187 html_include(cgit_repo->readme); 187 html_include(cgit_repo->readme);
188 html("</div>"); 188 html("</div>");
189 } 189 }
190 if (cgit_summary_log > 0) 190 if (ctx.cfg.summary_log > 0)
191 cgit_print_log(ctx.qry.head, 0, cgit_summary_log, NULL, 191 cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL,
192 NULL, NULL, 0); 192 NULL, NULL, 0);
193 html("<table summary='repository info' class='list nowrap'>"); 193 html("<table summary='repository info' class='list nowrap'>");
194 if (cgit_summary_log > 0) 194 if (ctx.cfg.summary_log > 0)
195 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>"); 195 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
196 cgit_print_branches(cgit_summary_branches); 196 cgit_print_branches(ctx.cfg.summary_branches);
197 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>"); 197 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
198 cgit_print_tags(cgit_summary_tags); 198 cgit_print_tags(ctx.cfg.summary_tags);
199 html("</table>"); 199 html("</table>");
200} 200}