summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c4
-rw-r--r--cgit.h2
-rw-r--r--cgitrc.5.txt10
-rw-r--r--shared.c1
-rw-r--r--ui-repolist.c9
-rw-r--r--ui-summary.c4
6 files changed, 28 insertions, 2 deletions
diff --git a/cgit.c b/cgit.c
index b3a98c1..cb1149d 100644
--- a/cgit.c
+++ b/cgit.c
@@ -69,48 +69,50 @@ void config_cb(const char *name, const char *value)
69 else if (!strcmp(name, "noheader")) 69 else if (!strcmp(name, "noheader"))
70 ctx.cfg.noheader = atoi(value); 70 ctx.cfg.noheader = atoi(value);
71 else if (!strcmp(name, "snapshots")) 71 else if (!strcmp(name, "snapshots"))
72 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); 72 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
73 else if (!strcmp(name, "enable-index-links")) 73 else if (!strcmp(name, "enable-index-links"))
74 ctx.cfg.enable_index_links = atoi(value); 74 ctx.cfg.enable_index_links = atoi(value);
75 else if (!strcmp(name, "enable-log-filecount")) 75 else if (!strcmp(name, "enable-log-filecount"))
76 ctx.cfg.enable_log_filecount = atoi(value); 76 ctx.cfg.enable_log_filecount = atoi(value);
77 else if (!strcmp(name, "enable-log-linecount")) 77 else if (!strcmp(name, "enable-log-linecount"))
78 ctx.cfg.enable_log_linecount = atoi(value); 78 ctx.cfg.enable_log_linecount = atoi(value);
79 else if (!strcmp(name, "max-stats")) 79 else if (!strcmp(name, "max-stats"))
80 ctx.cfg.max_stats = cgit_find_stats_period(value, NULL); 80 ctx.cfg.max_stats = cgit_find_stats_period(value, NULL);
81 else if (!strcmp(name, "cache-size")) 81 else if (!strcmp(name, "cache-size"))
82 ctx.cfg.cache_size = atoi(value); 82 ctx.cfg.cache_size = atoi(value);
83 else if (!strcmp(name, "cache-root")) 83 else if (!strcmp(name, "cache-root"))
84 ctx.cfg.cache_root = xstrdup(value); 84 ctx.cfg.cache_root = xstrdup(value);
85 else if (!strcmp(name, "cache-root-ttl")) 85 else if (!strcmp(name, "cache-root-ttl"))
86 ctx.cfg.cache_root_ttl = atoi(value); 86 ctx.cfg.cache_root_ttl = atoi(value);
87 else if (!strcmp(name, "cache-repo-ttl")) 87 else if (!strcmp(name, "cache-repo-ttl"))
88 ctx.cfg.cache_repo_ttl = atoi(value); 88 ctx.cfg.cache_repo_ttl = atoi(value);
89 else if (!strcmp(name, "cache-static-ttl")) 89 else if (!strcmp(name, "cache-static-ttl"))
90 ctx.cfg.cache_static_ttl = atoi(value); 90 ctx.cfg.cache_static_ttl = atoi(value);
91 else if (!strcmp(name, "cache-dynamic-ttl")) 91 else if (!strcmp(name, "cache-dynamic-ttl"))
92 ctx.cfg.cache_dynamic_ttl = atoi(value); 92 ctx.cfg.cache_dynamic_ttl = atoi(value);
93 else if (!strcmp(name, "about-filter"))
94 ctx.cfg.about_filter = new_filter(value, 0);
93 else if (!strcmp(name, "commit-filter")) 95 else if (!strcmp(name, "commit-filter"))
94 ctx.cfg.commit_filter = new_filter(value, 0); 96 ctx.cfg.commit_filter = new_filter(value, 0);
95 else if (!strcmp(name, "embedded")) 97 else if (!strcmp(name, "embedded"))
96 ctx.cfg.embedded = atoi(value); 98 ctx.cfg.embedded = atoi(value);
97 else if (!strcmp(name, "max-message-length")) 99 else if (!strcmp(name, "max-message-length"))
98 ctx.cfg.max_msg_len = atoi(value); 100 ctx.cfg.max_msg_len = atoi(value);
99 else if (!strcmp(name, "max-repodesc-length")) 101 else if (!strcmp(name, "max-repodesc-length"))
100 ctx.cfg.max_repodesc_len = atoi(value); 102 ctx.cfg.max_repodesc_len = atoi(value);
101 else if (!strcmp(name, "max-repo-count")) 103 else if (!strcmp(name, "max-repo-count"))
102 ctx.cfg.max_repo_count = atoi(value); 104 ctx.cfg.max_repo_count = atoi(value);
103 else if (!strcmp(name, "max-commit-count")) 105 else if (!strcmp(name, "max-commit-count"))
104 ctx.cfg.max_commit_count = atoi(value); 106 ctx.cfg.max_commit_count = atoi(value);
105 else if (!strcmp(name, "source-filter")) 107 else if (!strcmp(name, "source-filter"))
106 ctx.cfg.source_filter = new_filter(value, 1); 108 ctx.cfg.source_filter = new_filter(value, 1);
107 else if (!strcmp(name, "summary-log")) 109 else if (!strcmp(name, "summary-log"))
108 ctx.cfg.summary_log = atoi(value); 110 ctx.cfg.summary_log = atoi(value);
109 else if (!strcmp(name, "summary-branches")) 111 else if (!strcmp(name, "summary-branches"))
110 ctx.cfg.summary_branches = atoi(value); 112 ctx.cfg.summary_branches = atoi(value);
111 else if (!strcmp(name, "summary-tags")) 113 else if (!strcmp(name, "summary-tags"))
112 ctx.cfg.summary_tags = atoi(value); 114 ctx.cfg.summary_tags = atoi(value);
113 else if (!strcmp(name, "agefile")) 115 else if (!strcmp(name, "agefile"))
114 ctx.cfg.agefile = xstrdup(value); 116 ctx.cfg.agefile = xstrdup(value);
115 else if (!strcmp(name, "renamelimit")) 117 else if (!strcmp(name, "renamelimit"))
116 ctx.cfg.renamelimit = atoi(value); 118 ctx.cfg.renamelimit = atoi(value);
@@ -125,48 +127,50 @@ void config_cb(const char *name, const char *value)
125 else if (!strcmp(name, "repo.url")) 127 else if (!strcmp(name, "repo.url"))
126 ctx.repo = cgit_add_repo(value); 128 ctx.repo = cgit_add_repo(value);
127 else if (!strcmp(name, "repo.name")) 129 else if (!strcmp(name, "repo.name"))
128 ctx.repo->name = xstrdup(value); 130 ctx.repo->name = xstrdup(value);
129 else if (ctx.repo && !strcmp(name, "repo.path")) 131 else if (ctx.repo && !strcmp(name, "repo.path"))
130 ctx.repo->path = trim_end(value, '/'); 132 ctx.repo->path = trim_end(value, '/');
131 else if (ctx.repo && !strcmp(name, "repo.clone-url")) 133 else if (ctx.repo && !strcmp(name, "repo.clone-url"))
132 ctx.repo->clone_url = xstrdup(value); 134 ctx.repo->clone_url = xstrdup(value);
133 else if (ctx.repo && !strcmp(name, "repo.desc")) 135 else if (ctx.repo && !strcmp(name, "repo.desc"))
134 ctx.repo->desc = xstrdup(value); 136 ctx.repo->desc = xstrdup(value);
135 else if (ctx.repo && !strcmp(name, "repo.owner")) 137 else if (ctx.repo && !strcmp(name, "repo.owner"))
136 ctx.repo->owner = xstrdup(value); 138 ctx.repo->owner = xstrdup(value);
137 else if (ctx.repo && !strcmp(name, "repo.defbranch")) 139 else if (ctx.repo && !strcmp(name, "repo.defbranch"))
138 ctx.repo->defbranch = xstrdup(value); 140 ctx.repo->defbranch = xstrdup(value);
139 else if (ctx.repo && !strcmp(name, "repo.snapshots")) 141 else if (ctx.repo && !strcmp(name, "repo.snapshots"))
140 ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */ 142 ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
141 else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount")) 143 else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount"))
142 ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value); 144 ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
143 else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount")) 145 else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount"))
144 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value); 146 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
145 else if (ctx.repo && !strcmp(name, "repo.max-stats")) 147 else if (ctx.repo && !strcmp(name, "repo.max-stats"))
146 ctx.repo->max_stats = cgit_find_stats_period(value, NULL); 148 ctx.repo->max_stats = cgit_find_stats_period(value, NULL);
147 else if (ctx.repo && !strcmp(name, "repo.module-link")) 149 else if (ctx.repo && !strcmp(name, "repo.module-link"))
148 ctx.repo->module_link= xstrdup(value); 150 ctx.repo->module_link= xstrdup(value);
151 else if (ctx.repo && !strcmp(name, "repo.about-filter"))
152 ctx.repo->about_filter = new_filter(value, 0);
149 else if (ctx.repo && !strcmp(name, "repo.commit-filter")) 153 else if (ctx.repo && !strcmp(name, "repo.commit-filter"))
150 ctx.repo->commit_filter = new_filter(value, 0); 154 ctx.repo->commit_filter = new_filter(value, 0);
151 else if (ctx.repo && !strcmp(name, "repo.source-filter")) 155 else if (ctx.repo && !strcmp(name, "repo.source-filter"))
152 ctx.repo->source_filter = new_filter(value, 1); 156 ctx.repo->source_filter = new_filter(value, 1);
153 else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) { 157 else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) {
154 if (*value == '/') 158 if (*value == '/')
155 ctx.repo->readme = xstrdup(value); 159 ctx.repo->readme = xstrdup(value);
156 else 160 else
157 ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value)); 161 ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value));
158 } else if (!strcmp(name, "include")) 162 } else if (!strcmp(name, "include"))
159 parse_configfile(value, config_cb); 163 parse_configfile(value, config_cb);
160} 164}
161 165
162static void querystring_cb(const char *name, const char *value) 166static void querystring_cb(const char *name, const char *value)
163{ 167{
164 if (!strcmp(name,"r")) { 168 if (!strcmp(name,"r")) {
165 ctx.qry.repo = xstrdup(value); 169 ctx.qry.repo = xstrdup(value);
166 ctx.repo = cgit_get_repoinfo(value); 170 ctx.repo = cgit_get_repoinfo(value);
167 } else if (!strcmp(name, "p")) { 171 } else if (!strcmp(name, "p")) {
168 ctx.qry.page = xstrdup(value); 172 ctx.qry.page = xstrdup(value);
169 } else if (!strcmp(name, "url")) { 173 } else if (!strcmp(name, "url")) {
170 ctx.qry.url = xstrdup(value); 174 ctx.qry.url = xstrdup(value);
171 cgit_parse_url(value); 175 cgit_parse_url(value);
172 } else if (!strcmp(name, "qt")) { 176 } else if (!strcmp(name, "qt")) {
diff --git a/cgit.h b/cgit.h
index f10ba05..b8f4850 100644
--- a/cgit.h
+++ b/cgit.h
@@ -52,48 +52,49 @@ struct cgit_filter {
52 char *cmd; 52 char *cmd;
53 char **argv; 53 char **argv;
54 int old_stdout; 54 int old_stdout;
55 int pipe_fh[2]; 55 int pipe_fh[2];
56 int pid; 56 int pid;
57 int exitstatus; 57 int exitstatus;
58}; 58};
59 59
60struct cgit_repo { 60struct cgit_repo {
61 char *url; 61 char *url;
62 char *name; 62 char *name;
63 char *path; 63 char *path;
64 char *desc; 64 char *desc;
65 char *owner; 65 char *owner;
66 char *defbranch; 66 char *defbranch;
67 char *group; 67 char *group;
68 char *module_link; 68 char *module_link;
69 char *readme; 69 char *readme;
70 char *clone_url; 70 char *clone_url;
71 int snapshots; 71 int snapshots;
72 int enable_log_filecount; 72 int enable_log_filecount;
73 int enable_log_linecount; 73 int enable_log_linecount;
74 int max_stats; 74 int max_stats;
75 time_t mtime; 75 time_t mtime;
76 struct cgit_filter *about_filter;
76 struct cgit_filter *commit_filter; 77 struct cgit_filter *commit_filter;
77 struct cgit_filter *source_filter; 78 struct cgit_filter *source_filter;
78}; 79};
79 80
80struct cgit_repolist { 81struct cgit_repolist {
81 int length; 82 int length;
82 int count; 83 int count;
83 struct cgit_repo *repos; 84 struct cgit_repo *repos;
84}; 85};
85 86
86struct commitinfo { 87struct commitinfo {
87 struct commit *commit; 88 struct commit *commit;
88 char *author; 89 char *author;
89 char *author_email; 90 char *author_email;
90 unsigned long author_date; 91 unsigned long author_date;
91 char *committer; 92 char *committer;
92 char *committer_email; 93 char *committer_email;
93 unsigned long committer_date; 94 unsigned long committer_date;
94 char *subject; 95 char *subject;
95 char *msg; 96 char *msg;
96 char *msg_encoding; 97 char *msg_encoding;
97}; 98};
98 99
99struct taginfo { 100struct taginfo {
@@ -164,48 +165,49 @@ struct cgit_config {
164 int cache_size; 165 int cache_size;
165 int cache_dynamic_ttl; 166 int cache_dynamic_ttl;
166 int cache_max_create_time; 167 int cache_max_create_time;
167 int cache_repo_ttl; 168 int cache_repo_ttl;
168 int cache_root_ttl; 169 int cache_root_ttl;
169 int cache_static_ttl; 170 int cache_static_ttl;
170 int embedded; 171 int embedded;
171 int enable_index_links; 172 int enable_index_links;
172 int enable_log_filecount; 173 int enable_log_filecount;
173 int enable_log_linecount; 174 int enable_log_linecount;
174 int local_time; 175 int local_time;
175 int max_repo_count; 176 int max_repo_count;
176 int max_commit_count; 177 int max_commit_count;
177 int max_lock_attempts; 178 int max_lock_attempts;
178 int max_msg_len; 179 int max_msg_len;
179 int max_repodesc_len; 180 int max_repodesc_len;
180 int max_stats; 181 int max_stats;
181 int nocache; 182 int nocache;
182 int noheader; 183 int noheader;
183 int renamelimit; 184 int renamelimit;
184 int snapshots; 185 int snapshots;
185 int summary_branches; 186 int summary_branches;
186 int summary_log; 187 int summary_log;
187 int summary_tags; 188 int summary_tags;
189 struct cgit_filter *about_filter;
188 struct cgit_filter *commit_filter; 190 struct cgit_filter *commit_filter;
189 struct cgit_filter *source_filter; 191 struct cgit_filter *source_filter;
190}; 192};
191 193
192struct cgit_page { 194struct cgit_page {
193 time_t modified; 195 time_t modified;
194 time_t expires; 196 time_t expires;
195 size_t size; 197 size_t size;
196 char *mimetype; 198 char *mimetype;
197 char *charset; 199 char *charset;
198 char *filename; 200 char *filename;
199 char *etag; 201 char *etag;
200 char *title; 202 char *title;
201 int status; 203 int status;
202 char *statusmsg; 204 char *statusmsg;
203}; 205};
204 206
205struct cgit_context { 207struct cgit_context {
206 struct cgit_query qry; 208 struct cgit_query qry;
207 struct cgit_config cfg; 209 struct cgit_config cfg;
208 struct cgit_repo *repo; 210 struct cgit_repo *repo;
209 struct cgit_page page; 211 struct cgit_page page;
210}; 212};
211 213
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index ffb3e0f..d8e4b97 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -1,42 +1,49 @@
1CGITRC(5) 1CGITRC(5)
2======== 2========
3 3
4 4
5NAME 5NAME
6---- 6----
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::
31 Number which specifies the time-to-live, in minutes, for the cached 38 Number which specifies the time-to-live, in minutes, for the cached
32 version of repository pages accessed without a fixed SHA1. Default 39 version of repository pages accessed without a fixed SHA1. Default
33 value: "5". 40 value: "5".
34 41
35cache-repo-ttl:: 42cache-repo-ttl::
36 Number which specifies the time-to-live, in minutes, for the cached 43 Number which specifies the time-to-live, in minutes, for the cached
37 version of the repository summary page. Default value: "5". 44 version of the repository summary page. Default value: "5".
38 45
39cache-root-ttl:: 46cache-root-ttl::
40 Number which specifies the time-to-live, in minutes, for the cached 47 Number which specifies the time-to-live, in minutes, for the cached
41 version of the repository index page. Default value: "5". 48 version of the repository index page. Default value: "5".
42 49
@@ -213,48 +220,51 @@ source-filter::
213 none. 220 none.
214 221
215summary-branches:: 222summary-branches::
216 Specifies the number of branches to display in the repository "summary" 223 Specifies the number of branches to display in the repository "summary"
217 view. Default value: "10". 224 view. Default value: "10".
218 225
219summary-log:: 226summary-log::
220 Specifies the number of log entries to display in the repository 227 Specifies the number of log entries to display in the repository
221 "summary" view. Default value: "10". 228 "summary" view. Default value: "10".
222 229
223summary-tags:: 230summary-tags::
224 Specifies the number of tags to display in the repository "summary" 231 Specifies the number of tags to display in the repository "summary"
225 view. Default value: "10". 232 view. Default value: "10".
226 233
227virtual-root:: 234virtual-root::
228 Url which, if specified, will be used as root for all cgit links. It 235 Url which, if specified, will be used as root for all cgit links. It
229 will also cause cgit to generate 'virtual urls', i.e. urls like 236 will also cause cgit to generate 'virtual urls', i.e. urls like
230 '/cgit/tree/README' as opposed to '?r=cgit&p=tree&path=README'. Default 237 '/cgit/tree/README' as opposed to '?r=cgit&p=tree&path=README'. Default
231 value: none. 238 value: none.
232 NOTE: cgit has recently learned how to use PATH_INFO to achieve the 239 NOTE: cgit has recently learned how to use PATH_INFO to achieve the
233 same kind of virtual urls, so this option will probably be deprecated. 240 same kind of virtual urls, so this option will probably be deprecated.
234 241
235REPOSITORY SETTINGS 242REPOSITORY SETTINGS
236------------------- 243-------------------
244repo.about-filter::
245 Override the default about-filter. Default value: <about-filter>.
246
237repo.clone-url:: 247repo.clone-url::
238 A list of space-separated urls which can be used to clone this repo. 248 A list of space-separated urls which can be used to clone this repo.
239 Default value: none. 249 Default value: none.
240 250
241repo.commit-filter:: 251repo.commit-filter::
242 Override the default commit-filter. Default value: <commit-filter>. 252 Override the default commit-filter. Default value: <commit-filter>.
243 253
244repo.defbranch:: 254repo.defbranch::
245 The name of the default branch for this repository. If no such branch 255 The name of the default branch for this repository. If no such branch
246 exists in the repository, the first branch name (when sorted) is used 256 exists in the repository, the first branch name (when sorted) is used
247 as default instead. Default value: "master". 257 as default instead. Default value: "master".
248 258
249repo.desc:: 259repo.desc::
250 The value to show as repository description. Default value: none. 260 The value to show as repository description. Default value: none.
251 261
252repo.enable-log-filecount:: 262repo.enable-log-filecount::
253 A flag which can be used to disable the global setting 263 A flag which can be used to disable the global setting
254 `enable-log-filecount'. Default value: none. 264 `enable-log-filecount'. Default value: none.
255 265
256repo.enable-log-linecount:: 266repo.enable-log-linecount::
257 A flag which can be used to disable the global setting 267 A flag which can be used to disable the global setting
258 `enable-log-linecount'. Default value: none. 268 `enable-log-linecount'. Default value: none.
259 269
260repo.max-stats:: 270repo.max-stats::
diff --git a/shared.c b/shared.c
index 783604b..911a55a 100644
--- a/shared.c
+++ b/shared.c
@@ -41,48 +41,49 @@ struct cgit_repo *cgit_add_repo(const char *url)
41 if (cgit_repolist.length == 0) 41 if (cgit_repolist.length == 0)
42 cgit_repolist.length = 8; 42 cgit_repolist.length = 8;
43 else 43 else
44 cgit_repolist.length *= 2; 44 cgit_repolist.length *= 2;
45 cgit_repolist.repos = xrealloc(cgit_repolist.repos, 45 cgit_repolist.repos = xrealloc(cgit_repolist.repos,
46 cgit_repolist.length * 46 cgit_repolist.length *
47 sizeof(struct cgit_repo)); 47 sizeof(struct cgit_repo));
48 } 48 }
49 49
50 ret = &cgit_repolist.repos[cgit_repolist.count-1]; 50 ret = &cgit_repolist.repos[cgit_repolist.count-1];
51 ret->url = trim_end(url, '/'); 51 ret->url = trim_end(url, '/');
52 ret->name = ret->url; 52 ret->name = ret->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];
77 if (!strcmp(repo->url, url)) 78 if (!strcmp(repo->url, url))
78 return repo; 79 return repo;
79 } 80 }
80 return NULL; 81 return NULL;
81} 82}
82 83
83void *cgit_free_commitinfo(struct commitinfo *info) 84void *cgit_free_commitinfo(struct commitinfo *info)
84{ 85{
85 free(info->author); 86 free(info->author);
86 free(info->author_email); 87 free(info->author_email);
87 free(info->committer); 88 free(info->committer);
88 free(info->committer_email); 89 free(info->committer_email);
diff --git a/ui-repolist.c b/ui-repolist.c
index 2c13d50..25f076f 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -252,27 +252,32 @@ void cgit_print_repolist()
252 html_txt(ctx.repo->owner); 252 html_txt(ctx.repo->owner);
253 html("</td><td>"); 253 html("</td><td>");
254 print_modtime(ctx.repo); 254 print_modtime(ctx.repo);
255 html("</td>"); 255 html("</td>");
256 if (ctx.cfg.enable_index_links) { 256 if (ctx.cfg.enable_index_links) {
257 html("<td>"); 257 html("<td>");
258 cgit_summary_link("summary", NULL, "button", NULL); 258 cgit_summary_link("summary", NULL, "button", NULL);
259 cgit_log_link("log", NULL, "button", NULL, NULL, NULL, 259 cgit_log_link("log", NULL, "button", NULL, NULL, NULL,
260 0, NULL, NULL, ctx.qry.showmsg); 260 0, NULL, NULL, ctx.qry.showmsg);
261 cgit_tree_link("tree", NULL, "button", NULL, NULL, NULL); 261 cgit_tree_link("tree", NULL, "button", NULL, NULL, NULL);
262 html("</td>"); 262 html("</td>");
263 } 263 }
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 html_include(ctx.cfg.root_readme); 277 return;
278 if (ctx.cfg.about_filter)
279 cgit_open_filter(ctx.cfg.about_filter);
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 f2a9b46..a2c018e 100644
--- a/ui-summary.c
+++ b/ui-summary.c
@@ -62,27 +62,31 @@ void cgit_print_summary()
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(char *path) 69void cgit_print_repo_readme(char *path)
70{ 70{
71 char *slash, *tmp; 71 char *slash, *tmp;
72 72
73 if (!ctx.repo->readme) 73 if (!ctx.repo->readme)
74 return; 74 return;
75 75
76 if (path) { 76 if (path) {
77 slash = strrchr(ctx.repo->readme, '/'); 77 slash = strrchr(ctx.repo->readme, '/');
78 if (!slash) 78 if (!slash)
79 return; 79 return;
80 tmp = xmalloc(slash - ctx.repo->readme + 1 + strlen(path) + 1); 80 tmp = xmalloc(slash - ctx.repo->readme + 1 + strlen(path) + 1);
81 strncpy(tmp, ctx.repo->readme, slash - ctx.repo->readme + 1); 81 strncpy(tmp, ctx.repo->readme, slash - ctx.repo->readme + 1);
82 strcpy(tmp + (slash - ctx.repo->readme + 1), path); 82 strcpy(tmp + (slash - ctx.repo->readme + 1), path);
83 } else 83 } else
84 tmp = ctx.repo->readme; 84 tmp = ctx.repo->readme;
85 html("<div id='summary'>"); 85 html("<div id='summary'>");
86 if (ctx.repo->about_filter)
87 cgit_open_filter(ctx.repo->about_filter);
86 html_include(tmp); 88 html_include(tmp);
89 if (ctx.repo->about_filter)
90 cgit_close_filter(ctx.repo->about_filter);
87 html("</div>"); 91 html("</div>");
88} 92}