summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2009-08-09 11:46:34 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2009-08-09 11:46:34 (UTC)
commitdb8b8cb9467625cb8d9ecb67863aa67590e59cc0 (patch) (unidiff)
treed27644fc1b98ec6365e74f3ba40c19f78f8a287f
parentdb6303b58883c4417f5bcc0c1ee34fed6553dca3 (diff)
parent537c05f138d59c1eb3ac8e2d8b0dca3a38aa5dd4 (diff)
downloadcgit-db8b8cb9467625cb8d9ecb67863aa67590e59cc0.zip
cgit-db8b8cb9467625cb8d9ecb67863aa67590e59cc0.tar.gz
cgit-db8b8cb9467625cb8d9ecb67863aa67590e59cc0.tar.bz2
Merge branch 'lh/about'
Conflicts: cgit.h
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--cgit.c4
-rw-r--r--cgit.h2
-rw-r--r--cgitrc.5.txt10
-rw-r--r--cmd.c2
-rw-r--r--shared.c1
-rw-r--r--ui-repolist.c7
-rw-r--r--ui-summary.c24
-rw-r--r--ui-summary.h2
8 files changed, 45 insertions, 7 deletions
diff --git a/cgit.c b/cgit.c
index dbec196..7b228af 100644
--- a/cgit.c
+++ b/cgit.c
@@ -91,24 +91,26 @@ void config_cb(const char *name, const char *value)
91 else if (!strcmp(name, "cache-size")) 91 else if (!strcmp(name, "cache-size"))
92 ctx.cfg.cache_size = atoi(value); 92 ctx.cfg.cache_size = atoi(value);
93 else if (!strcmp(name, "cache-root")) 93 else if (!strcmp(name, "cache-root"))
94 ctx.cfg.cache_root = xstrdup(value); 94 ctx.cfg.cache_root = xstrdup(value);
95 else if (!strcmp(name, "cache-root-ttl")) 95 else if (!strcmp(name, "cache-root-ttl"))
96 ctx.cfg.cache_root_ttl = atoi(value); 96 ctx.cfg.cache_root_ttl = atoi(value);
97 else if (!strcmp(name, "cache-repo-ttl")) 97 else if (!strcmp(name, "cache-repo-ttl"))
98 ctx.cfg.cache_repo_ttl = atoi(value); 98 ctx.cfg.cache_repo_ttl = atoi(value);
99 else if (!strcmp(name, "cache-static-ttl")) 99 else if (!strcmp(name, "cache-static-ttl"))
100 ctx.cfg.cache_static_ttl = atoi(value); 100 ctx.cfg.cache_static_ttl = atoi(value);
101 else if (!strcmp(name, "cache-dynamic-ttl")) 101 else if (!strcmp(name, "cache-dynamic-ttl"))
102 ctx.cfg.cache_dynamic_ttl = atoi(value); 102 ctx.cfg.cache_dynamic_ttl = atoi(value);
103 else if (!strcmp(name, "about-filter"))
104 ctx.cfg.about_filter = new_filter(value, 0);
103 else if (!strcmp(name, "commit-filter")) 105 else if (!strcmp(name, "commit-filter"))
104 ctx.cfg.commit_filter = new_filter(value, 0); 106 ctx.cfg.commit_filter = new_filter(value, 0);
105 else if (!strcmp(name, "embedded")) 107 else if (!strcmp(name, "embedded"))
106 ctx.cfg.embedded = atoi(value); 108 ctx.cfg.embedded = atoi(value);
107 else if (!strcmp(name, "max-message-length")) 109 else if (!strcmp(name, "max-message-length"))
108 ctx.cfg.max_msg_len = atoi(value); 110 ctx.cfg.max_msg_len = atoi(value);
109 else if (!strcmp(name, "max-repodesc-length")) 111 else if (!strcmp(name, "max-repodesc-length"))
110 ctx.cfg.max_repodesc_len = atoi(value); 112 ctx.cfg.max_repodesc_len = atoi(value);
111 else if (!strcmp(name, "max-repo-count")) 113 else if (!strcmp(name, "max-repo-count"))
112 ctx.cfg.max_repo_count = atoi(value); 114 ctx.cfg.max_repo_count = atoi(value);
113 else if (!strcmp(name, "max-commit-count")) 115 else if (!strcmp(name, "max-commit-count"))
114 ctx.cfg.max_commit_count = atoi(value); 116 ctx.cfg.max_commit_count = atoi(value);
@@ -149,24 +151,26 @@ void config_cb(const char *name, const char *value)
149 else if (ctx.repo && !strcmp(name, "repo.defbranch")) 151 else if (ctx.repo && !strcmp(name, "repo.defbranch"))
150 ctx.repo->defbranch = xstrdup(value); 152 ctx.repo->defbranch = xstrdup(value);
151 else if (ctx.repo && !strcmp(name, "repo.snapshots")) 153 else if (ctx.repo && !strcmp(name, "repo.snapshots"))
152 ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */ 154 ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
153 else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount")) 155 else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount"))
154 ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value); 156 ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
155 else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount")) 157 else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount"))
156 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value); 158 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
157 else if (ctx.repo && !strcmp(name, "repo.max-stats")) 159 else if (ctx.repo && !strcmp(name, "repo.max-stats"))
158 ctx.repo->max_stats = cgit_find_stats_period(value, NULL); 160 ctx.repo->max_stats = cgit_find_stats_period(value, NULL);
159 else if (ctx.repo && !strcmp(name, "repo.module-link")) 161 else if (ctx.repo && !strcmp(name, "repo.module-link"))
160 ctx.repo->module_link= xstrdup(value); 162 ctx.repo->module_link= xstrdup(value);
163 else if (ctx.repo && !strcmp(name, "repo.about-filter"))
164 ctx.repo->about_filter = new_filter(value, 0);
161 else if (ctx.repo && !strcmp(name, "repo.commit-filter")) 165 else if (ctx.repo && !strcmp(name, "repo.commit-filter"))
162 ctx.repo->commit_filter = new_filter(value, 0); 166 ctx.repo->commit_filter = new_filter(value, 0);
163 else if (ctx.repo && !strcmp(name, "repo.source-filter")) 167 else if (ctx.repo && !strcmp(name, "repo.source-filter"))
164 ctx.repo->source_filter = new_filter(value, 1); 168 ctx.repo->source_filter = new_filter(value, 1);
165 else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) { 169 else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) {
166 if (*value == '/') 170 if (*value == '/')
167 ctx.repo->readme = xstrdup(value); 171 ctx.repo->readme = xstrdup(value);
168 else 172 else
169 ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value)); 173 ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value));
170 } else if (!strcmp(name, "include")) 174 } else if (!strcmp(name, "include"))
171 parse_configfile(value, config_cb); 175 parse_configfile(value, config_cb);
172} 176}
diff --git a/cgit.h b/cgit.h
index b8557ac..4c854ea 100644
--- a/cgit.h
+++ b/cgit.h
@@ -65,24 +65,25 @@ struct cgit_repo {
65 char *desc; 65 char *desc;
66 char *owner; 66 char *owner;
67 char *defbranch; 67 char *defbranch;
68 char *group; 68 char *group;
69 char *module_link; 69 char *module_link;
70 char *readme; 70 char *readme;
71 char *clone_url; 71 char *clone_url;
72 int snapshots; 72 int snapshots;
73 int enable_log_filecount; 73 int enable_log_filecount;
74 int enable_log_linecount; 74 int enable_log_linecount;
75 int max_stats; 75 int max_stats;
76 time_t mtime; 76 time_t mtime;
77 struct cgit_filter *about_filter;
77 struct cgit_filter *commit_filter; 78 struct cgit_filter *commit_filter;
78 struct cgit_filter *source_filter; 79 struct cgit_filter *source_filter;
79}; 80};
80 81
81struct cgit_repolist { 82struct cgit_repolist {
82 int length; 83 int length;
83 int count; 84 int count;
84 struct cgit_repo *repos; 85 struct cgit_repo *repos;
85}; 86};
86 87
87struct commitinfo { 88struct commitinfo {
88 struct commit *commit; 89 struct commit *commit;
@@ -179,24 +180,25 @@ struct cgit_config {
179 int max_msg_len; 180 int max_msg_len;
180 int max_repodesc_len; 181 int max_repodesc_len;
181 int max_stats; 182 int max_stats;
182 int nocache; 183 int nocache;
183 int noplainemail; 184 int noplainemail;
184 int noheader; 185 int noheader;
185 int renamelimit; 186 int renamelimit;
186 int snapshots; 187 int snapshots;
187 int summary_branches; 188 int summary_branches;
188 int summary_log; 189 int summary_log;
189 int summary_tags; 190 int summary_tags;
190 struct string_list mimetypes; 191 struct string_list mimetypes;
192 struct cgit_filter *about_filter;
191 struct cgit_filter *commit_filter; 193 struct cgit_filter *commit_filter;
192 struct cgit_filter *source_filter; 194 struct cgit_filter *source_filter;
193}; 195};
194 196
195struct cgit_page { 197struct cgit_page {
196 time_t modified; 198 time_t modified;
197 time_t expires; 199 time_t expires;
198 size_t size; 200 size_t size;
199 char *mimetype; 201 char *mimetype;
200 char *charset; 202 char *charset;
201 char *filename; 203 char *filename;
202 char *etag; 204 char *etag;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index dc63637..4d656fe 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -7,24 +7,31 @@ NAME
7cgitrc - runtime configuration for cgit 7cgitrc - runtime configuration for cgit
8 8
9 9
10SYNOPSIS 10SYNOPSIS
11-------- 11--------
12Cgitrc contains all runtime settings for cgit, including the list of git 12Cgitrc contains all runtime settings for cgit, including the list of git
13repositories, formatted as a line-separated list of NAME=VALUE pairs. Blank 13repositories, formatted as a line-separated list of NAME=VALUE pairs. Blank
14lines, and lines starting with '#', are ignored. 14lines, and lines starting with '#', are ignored.
15 15
16 16
17GLOBAL SETTINGS 17GLOBAL SETTINGS
18--------------- 18---------------
19about-filter::
20 Specifies a command which will be invoked to format the content of
21 about pages (both top-level and for each repository). The command will
22 get the content of the about-file on its STDIN, and the STDOUT from the
23 command will be included verbatim on the about page. Default value:
24 none.
25
19agefile:: 26agefile::
20 Specifies a path, relative to each repository path, which can be used 27 Specifies a path, relative to each repository path, which can be used
21 to specify the date and time of the youngest commit in the repository. 28 to specify the date and time of the youngest commit in the repository.
22 The first line in the file is used as input to the "parse_date" 29 The first line in the file is used as input to the "parse_date"
23 function in libgit. Recommended timestamp-format is "yyyy-mm-dd 30 function in libgit. Recommended timestamp-format is "yyyy-mm-dd
24 hh:mm:ss". Default value: "info/web/last-modified". 31 hh:mm:ss". Default value: "info/web/last-modified".
25 32
26cache-root:: 33cache-root::
27 Path used to store the cgit cache entries. Default value: 34 Path used to store the cgit cache entries. Default value:
28 "/var/cache/cgit". 35 "/var/cache/cgit".
29 36
30cache-dynamic-ttl:: 37cache-dynamic-ttl::
@@ -233,24 +240,27 @@ summary-tags::
233 view. Default value: "10". 240 view. Default value: "10".
234 241
235virtual-root:: 242virtual-root::
236 Url which, if specified, will be used as root for all cgit links. It 243 Url which, if specified, will be used as root for all cgit links. It
237 will also cause cgit to generate 'virtual urls', i.e. urls like 244 will also cause cgit to generate 'virtual urls', i.e. urls like
238 '/cgit/tree/README' as opposed to '?r=cgit&p=tree&path=README'. Default 245 '/cgit/tree/README' as opposed to '?r=cgit&p=tree&path=README'. Default
239 value: none. 246 value: none.
240 NOTE: cgit has recently learned how to use PATH_INFO to achieve the 247 NOTE: cgit has recently learned how to use PATH_INFO to achieve the
241 same kind of virtual urls, so this option will probably be deprecated. 248 same kind of virtual urls, so this option will probably be deprecated.
242 249
243REPOSITORY SETTINGS 250REPOSITORY SETTINGS
244------------------- 251-------------------
252repo.about-filter::
253 Override the default about-filter. Default value: <about-filter>.
254
245repo.clone-url:: 255repo.clone-url::
246 A list of space-separated urls which can be used to clone this repo. 256 A list of space-separated urls which can be used to clone this repo.
247 Default value: none. 257 Default value: none.
248 258
249repo.commit-filter:: 259repo.commit-filter::
250 Override the default commit-filter. Default value: <commit-filter>. 260 Override the default commit-filter. Default value: <commit-filter>.
251 261
252repo.defbranch:: 262repo.defbranch::
253 The name of the default branch for this repository. If no such branch 263 The name of the default branch for this repository. If no such branch
254 exists in the repository, the first branch name (when sorted) is used 264 exists in the repository, the first branch name (when sorted) is used
255 as default instead. Default value: "master". 265 as default instead. Default value: "master".
256 266
diff --git a/cmd.c b/cmd.c
index cf97da7..766f903 100644
--- a/cmd.c
+++ b/cmd.c
@@ -30,25 +30,25 @@ static void HEAD_fn(struct cgit_context *ctx)
30{ 30{
31 cgit_clone_head(ctx); 31 cgit_clone_head(ctx);
32} 32}
33 33
34static void atom_fn(struct cgit_context *ctx) 34static void atom_fn(struct cgit_context *ctx)
35{ 35{
36 cgit_print_atom(ctx->qry.head, ctx->qry.path, 10); 36 cgit_print_atom(ctx->qry.head, ctx->qry.path, 10);
37} 37}
38 38
39static void about_fn(struct cgit_context *ctx) 39static void about_fn(struct cgit_context *ctx)
40{ 40{
41 if (ctx->repo) 41 if (ctx->repo)
42 cgit_print_repo_readme(); 42 cgit_print_repo_readme(ctx->qry.path);
43 else 43 else
44 cgit_print_site_readme(); 44 cgit_print_site_readme();
45} 45}
46 46
47static void blob_fn(struct cgit_context *ctx) 47static void blob_fn(struct cgit_context *ctx)
48{ 48{
49 cgit_print_blob(ctx->qry.sha1, ctx->qry.path, ctx->qry.head); 49 cgit_print_blob(ctx->qry.sha1, ctx->qry.path, ctx->qry.head);
50} 50}
51 51
52static void commit_fn(struct cgit_context *ctx) 52static void commit_fn(struct cgit_context *ctx)
53{ 53{
54 cgit_print_commit(ctx->qry.sha1); 54 cgit_print_commit(ctx->qry.sha1);
diff --git a/shared.c b/shared.c
index 783604b..911a55a 100644
--- a/shared.c
+++ b/shared.c
@@ -53,24 +53,25 @@ struct cgit_repo *cgit_add_repo(const char *url)
53 ret->path = NULL; 53 ret->path = NULL;
54 ret->desc = "[no description]"; 54 ret->desc = "[no description]";
55 ret->owner = NULL; 55 ret->owner = NULL;
56 ret->group = ctx.cfg.repo_group; 56 ret->group = ctx.cfg.repo_group;
57 ret->defbranch = "master"; 57 ret->defbranch = "master";
58 ret->snapshots = ctx.cfg.snapshots; 58 ret->snapshots = ctx.cfg.snapshots;
59 ret->enable_log_filecount = ctx.cfg.enable_log_filecount; 59 ret->enable_log_filecount = ctx.cfg.enable_log_filecount;
60 ret->enable_log_linecount = ctx.cfg.enable_log_linecount; 60 ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
61 ret->max_stats = ctx.cfg.max_stats; 61 ret->max_stats = ctx.cfg.max_stats;
62 ret->module_link = ctx.cfg.module_link; 62 ret->module_link = ctx.cfg.module_link;
63 ret->readme = NULL; 63 ret->readme = NULL;
64 ret->mtime = -1; 64 ret->mtime = -1;
65 ret->about_filter = ctx.cfg.about_filter;
65 ret->commit_filter = ctx.cfg.commit_filter; 66 ret->commit_filter = ctx.cfg.commit_filter;
66 ret->source_filter = ctx.cfg.source_filter; 67 ret->source_filter = ctx.cfg.source_filter;
67 return ret; 68 return ret;
68} 69}
69 70
70struct cgit_repo *cgit_get_repoinfo(const char *url) 71struct cgit_repo *cgit_get_repoinfo(const char *url)
71{ 72{
72 int i; 73 int i;
73 struct cgit_repo *repo; 74 struct cgit_repo *repo;
74 75
75 for (i=0; i<cgit_repolist.count; i++) { 76 for (i=0; i<cgit_repolist.count; i++) {
76 repo = &cgit_repolist.repos[i]; 77 repo = &cgit_repolist.repos[i];
diff --git a/ui-repolist.c b/ui-repolist.c
index 2c13d50..25f076f 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -264,15 +264,20 @@ void cgit_print_repolist()
264 html("</tr>\n"); 264 html("</tr>\n");
265 } 265 }
266 html("</table>"); 266 html("</table>");
267 if (!hits) 267 if (!hits)
268 cgit_print_error("No repositories found"); 268 cgit_print_error("No repositories found");
269 else if (hits > ctx.cfg.max_repo_count) 269 else if (hits > ctx.cfg.max_repo_count)
270 print_pager(hits, ctx.cfg.max_repo_count, ctx.qry.search); 270 print_pager(hits, ctx.cfg.max_repo_count, ctx.qry.search);
271 cgit_print_docend(); 271 cgit_print_docend();
272} 272}
273 273
274void cgit_print_site_readme() 274void cgit_print_site_readme()
275{ 275{
276 if (ctx.cfg.root_readme) 276 if (!ctx.cfg.root_readme)
277 return;
278 if (ctx.cfg.about_filter)
279 cgit_open_filter(ctx.cfg.about_filter);
277 html_include(ctx.cfg.root_readme); 280 html_include(ctx.cfg.root_readme);
281 if (ctx.cfg.about_filter)
282 cgit_close_filter(ctx.cfg.about_filter);
278} 283}
diff --git a/ui-summary.c b/ui-summary.c
index ede4a62..a2c018e 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -57,20 +57,36 @@ void cgit_print_summary()
57 if (ctx.cfg.summary_log > 0) { 57 if (ctx.cfg.summary_log > 0) {
58 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>"); 58 html("<tr class='nohover'><td colspan='4'>&nbsp;</td></tr>");
59 cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL, 59 cgit_print_log(ctx.qry.head, 0, ctx.cfg.summary_log, NULL,
60 NULL, NULL, 0); 60 NULL, NULL, 0);
61 } 61 }
62 if (ctx.repo->clone_url) 62 if (ctx.repo->clone_url)
63 print_urls(ctx.repo->clone_url, NULL); 63 print_urls(ctx.repo->clone_url, NULL);
64 else if (ctx.cfg.clone_prefix) 64 else if (ctx.cfg.clone_prefix)
65 print_urls(ctx.cfg.clone_prefix, ctx.repo->url); 65 print_urls(ctx.cfg.clone_prefix, ctx.repo->url);
66 html("</table>"); 66 html("</table>");
67} 67}
68 68
69void cgit_print_repo_readme() 69void cgit_print_repo_readme(char *path)
70{ 70{
71 if (ctx.repo->readme) { 71 char *slash, *tmp;
72
73 if (!ctx.repo->readme)
74 return;
75
76 if (path) {
77 slash = strrchr(ctx.repo->readme, '/');
78 if (!slash)
79 return;
80 tmp = xmalloc(slash - ctx.repo->readme + 1 + strlen(path) + 1);
81 strncpy(tmp, ctx.repo->readme, slash - ctx.repo->readme + 1);
82 strcpy(tmp + (slash - ctx.repo->readme + 1), path);
83 } else
84 tmp = ctx.repo->readme;
72 html("<div id='summary'>"); 85 html("<div id='summary'>");
73 html_include(ctx.repo->readme); 86 if (ctx.repo->about_filter)
87 cgit_open_filter(ctx.repo->about_filter);
88 html_include(tmp);
89 if (ctx.repo->about_filter)
90 cgit_close_filter(ctx.repo->about_filter);
74 html("</div>"); 91 html("</div>");
75 } 92 }
76}
diff --git a/ui-summary.h b/ui-summary.h
index 3e13039..c01f560 100644
--- a/ui-summary.h
+++ b/ui-summary.h
@@ -1,7 +1,7 @@
1#ifndef UI_SUMMARY_H 1#ifndef UI_SUMMARY_H
2#define UI_SUMMARY_H 2#define UI_SUMMARY_H
3 3
4extern void cgit_print_summary(); 4extern void cgit_print_summary();
5extern void cgit_print_repo_readme(); 5extern void cgit_print_repo_readme(char *path);
6 6
7#endif /* UI_SUMMARY_H */ 7#endif /* UI_SUMMARY_H */