summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c5
-rw-r--r--cgit.h2
-rw-r--r--cgitrc.5.txt4
-rw-r--r--cmd.c2
-rw-r--r--ui-atom.c4
5 files changed, 15 insertions, 2 deletions
diff --git a/cgit.c b/cgit.c
index 6ccf4aa..38bc136 100644
--- a/cgit.c
+++ b/cgit.c
@@ -140,64 +140,66 @@ void config_cb(const char *name, const char *value)
140 else if (!strcmp(name, "enable-log-filecount")) 140 else if (!strcmp(name, "enable-log-filecount"))
141 ctx.cfg.enable_log_filecount = atoi(value); 141 ctx.cfg.enable_log_filecount = atoi(value);
142 else if (!strcmp(name, "enable-log-linecount")) 142 else if (!strcmp(name, "enable-log-linecount"))
143 ctx.cfg.enable_log_linecount = atoi(value); 143 ctx.cfg.enable_log_linecount = atoi(value);
144 else if (!strcmp(name, "enable-remote-branches")) 144 else if (!strcmp(name, "enable-remote-branches"))
145 ctx.cfg.enable_remote_branches = atoi(value); 145 ctx.cfg.enable_remote_branches = atoi(value);
146 else if (!strcmp(name, "enable-subject-links")) 146 else if (!strcmp(name, "enable-subject-links"))
147 ctx.cfg.enable_subject_links = atoi(value); 147 ctx.cfg.enable_subject_links = atoi(value);
148 else if (!strcmp(name, "enable-tree-linenumbers")) 148 else if (!strcmp(name, "enable-tree-linenumbers"))
149 ctx.cfg.enable_tree_linenumbers = atoi(value); 149 ctx.cfg.enable_tree_linenumbers = atoi(value);
150 else if (!strcmp(name, "max-stats")) 150 else if (!strcmp(name, "max-stats"))
151 ctx.cfg.max_stats = cgit_find_stats_period(value, NULL); 151 ctx.cfg.max_stats = cgit_find_stats_period(value, NULL);
152 else if (!strcmp(name, "cache-size")) 152 else if (!strcmp(name, "cache-size"))
153 ctx.cfg.cache_size = atoi(value); 153 ctx.cfg.cache_size = atoi(value);
154 else if (!strcmp(name, "cache-root")) 154 else if (!strcmp(name, "cache-root"))
155 ctx.cfg.cache_root = xstrdup(value); 155 ctx.cfg.cache_root = xstrdup(value);
156 else if (!strcmp(name, "cache-root-ttl")) 156 else if (!strcmp(name, "cache-root-ttl"))
157 ctx.cfg.cache_root_ttl = atoi(value); 157 ctx.cfg.cache_root_ttl = atoi(value);
158 else if (!strcmp(name, "cache-repo-ttl")) 158 else if (!strcmp(name, "cache-repo-ttl"))
159 ctx.cfg.cache_repo_ttl = atoi(value); 159 ctx.cfg.cache_repo_ttl = atoi(value);
160 else if (!strcmp(name, "cache-scanrc-ttl")) 160 else if (!strcmp(name, "cache-scanrc-ttl"))
161 ctx.cfg.cache_scanrc_ttl = atoi(value); 161 ctx.cfg.cache_scanrc_ttl = atoi(value);
162 else if (!strcmp(name, "cache-static-ttl")) 162 else if (!strcmp(name, "cache-static-ttl"))
163 ctx.cfg.cache_static_ttl = atoi(value); 163 ctx.cfg.cache_static_ttl = atoi(value);
164 else if (!strcmp(name, "cache-dynamic-ttl")) 164 else if (!strcmp(name, "cache-dynamic-ttl"))
165 ctx.cfg.cache_dynamic_ttl = atoi(value); 165 ctx.cfg.cache_dynamic_ttl = atoi(value);
166 else if (!strcmp(name, "about-filter")) 166 else if (!strcmp(name, "about-filter"))
167 ctx.cfg.about_filter = new_filter(value, 0); 167 ctx.cfg.about_filter = new_filter(value, 0);
168 else if (!strcmp(name, "commit-filter")) 168 else if (!strcmp(name, "commit-filter"))
169 ctx.cfg.commit_filter = new_filter(value, 0); 169 ctx.cfg.commit_filter = new_filter(value, 0);
170 else if (!strcmp(name, "embedded")) 170 else if (!strcmp(name, "embedded"))
171 ctx.cfg.embedded = atoi(value); 171 ctx.cfg.embedded = atoi(value);
172 else if (!strcmp(name, "max-atom-items"))
173 ctx.cfg.max_atom_items = atoi(value);
172 else if (!strcmp(name, "max-message-length")) 174 else if (!strcmp(name, "max-message-length"))
173 ctx.cfg.max_msg_len = atoi(value); 175 ctx.cfg.max_msg_len = atoi(value);
174 else if (!strcmp(name, "max-repodesc-length")) 176 else if (!strcmp(name, "max-repodesc-length"))
175 ctx.cfg.max_repodesc_len = atoi(value); 177 ctx.cfg.max_repodesc_len = atoi(value);
176 else if (!strcmp(name, "max-blob-size")) 178 else if (!strcmp(name, "max-blob-size"))
177 ctx.cfg.max_blob_size = atoi(value); 179 ctx.cfg.max_blob_size = atoi(value);
178 else if (!strcmp(name, "max-repo-count")) 180 else if (!strcmp(name, "max-repo-count"))
179 ctx.cfg.max_repo_count = atoi(value); 181 ctx.cfg.max_repo_count = atoi(value);
180 else if (!strcmp(name, "max-commit-count")) 182 else if (!strcmp(name, "max-commit-count"))
181 ctx.cfg.max_commit_count = atoi(value); 183 ctx.cfg.max_commit_count = atoi(value);
182 else if (!strcmp(name, "scan-path")) 184 else if (!strcmp(name, "scan-path"))
183 if (!ctx.cfg.nocache && ctx.cfg.cache_size) 185 if (!ctx.cfg.nocache && ctx.cfg.cache_size)
184 process_cached_repolist(value); 186 process_cached_repolist(value);
185 else 187 else
186 scan_tree(value, repo_config); 188 scan_tree(value, repo_config);
187 else if (!strcmp(name, "source-filter")) 189 else if (!strcmp(name, "source-filter"))
188 ctx.cfg.source_filter = new_filter(value, 1); 190 ctx.cfg.source_filter = new_filter(value, 1);
189 else if (!strcmp(name, "summary-log")) 191 else if (!strcmp(name, "summary-log"))
190 ctx.cfg.summary_log = atoi(value); 192 ctx.cfg.summary_log = atoi(value);
191 else if (!strcmp(name, "summary-branches")) 193 else if (!strcmp(name, "summary-branches"))
192 ctx.cfg.summary_branches = atoi(value); 194 ctx.cfg.summary_branches = atoi(value);
193 else if (!strcmp(name, "summary-tags")) 195 else if (!strcmp(name, "summary-tags"))
194 ctx.cfg.summary_tags = atoi(value); 196 ctx.cfg.summary_tags = atoi(value);
195 else if (!strcmp(name, "side-by-side-diffs")) 197 else if (!strcmp(name, "side-by-side-diffs"))
196 ctx.cfg.ssdiff = atoi(value); 198 ctx.cfg.ssdiff = atoi(value);
197 else if (!strcmp(name, "agefile")) 199 else if (!strcmp(name, "agefile"))
198 ctx.cfg.agefile = xstrdup(value); 200 ctx.cfg.agefile = xstrdup(value);
199 else if (!strcmp(name, "renamelimit")) 201 else if (!strcmp(name, "renamelimit"))
200 ctx.cfg.renamelimit = atoi(value); 202 ctx.cfg.renamelimit = atoi(value);
201 else if (!strcmp(name, "robots")) 203 else if (!strcmp(name, "robots"))
202 ctx.cfg.robots = xstrdup(value); 204 ctx.cfg.robots = xstrdup(value);
203 else if (!strcmp(name, "clone-prefix")) 205 else if (!strcmp(name, "clone-prefix"))
@@ -225,106 +227,109 @@ static void querystring_cb(const char *name, const char *value)
225 value++; 227 value++;
226 ctx.qry.url = xstrdup(value); 228 ctx.qry.url = xstrdup(value);
227 cgit_parse_url(value); 229 cgit_parse_url(value);
228 } else if (!strcmp(name, "qt")) { 230 } else if (!strcmp(name, "qt")) {
229 ctx.qry.grep = xstrdup(value); 231 ctx.qry.grep = xstrdup(value);
230 } else if (!strcmp(name, "q")) { 232 } else if (!strcmp(name, "q")) {
231 ctx.qry.search = xstrdup(value); 233 ctx.qry.search = xstrdup(value);
232 } else if (!strcmp(name, "h")) { 234 } else if (!strcmp(name, "h")) {
233 ctx.qry.head = xstrdup(value); 235 ctx.qry.head = xstrdup(value);
234 ctx.qry.has_symref = 1; 236 ctx.qry.has_symref = 1;
235 } else if (!strcmp(name, "id")) { 237 } else if (!strcmp(name, "id")) {
236 ctx.qry.sha1 = xstrdup(value); 238 ctx.qry.sha1 = xstrdup(value);
237 ctx.qry.has_sha1 = 1; 239 ctx.qry.has_sha1 = 1;
238 } else if (!strcmp(name, "id2")) { 240 } else if (!strcmp(name, "id2")) {
239 ctx.qry.sha2 = xstrdup(value); 241 ctx.qry.sha2 = xstrdup(value);
240 ctx.qry.has_sha1 = 1; 242 ctx.qry.has_sha1 = 1;
241 } else if (!strcmp(name, "ofs")) { 243 } else if (!strcmp(name, "ofs")) {
242 ctx.qry.ofs = atoi(value); 244 ctx.qry.ofs = atoi(value);
243 } else if (!strcmp(name, "path")) { 245 } else if (!strcmp(name, "path")) {
244 ctx.qry.path = trim_end(value, '/'); 246 ctx.qry.path = trim_end(value, '/');
245 } else if (!strcmp(name, "name")) { 247 } else if (!strcmp(name, "name")) {
246 ctx.qry.name = xstrdup(value); 248 ctx.qry.name = xstrdup(value);
247 } else if (!strcmp(name, "mimetype")) { 249 } else if (!strcmp(name, "mimetype")) {
248 ctx.qry.mimetype = xstrdup(value); 250 ctx.qry.mimetype = xstrdup(value);
249 } else if (!strcmp(name, "s")){ 251 } else if (!strcmp(name, "s")){
250 ctx.qry.sort = xstrdup(value); 252 ctx.qry.sort = xstrdup(value);
251 } else if (!strcmp(name, "showmsg")) { 253 } else if (!strcmp(name, "showmsg")) {
252 ctx.qry.showmsg = atoi(value); 254 ctx.qry.showmsg = atoi(value);
253 } else if (!strcmp(name, "period")) { 255 } else if (!strcmp(name, "period")) {
254 ctx.qry.period = xstrdup(value); 256 ctx.qry.period = xstrdup(value);
255 } else if (!strcmp(name, "ss")) { 257 } else if (!strcmp(name, "ss")) {
256 ctx.qry.ssdiff = atoi(value); 258 ctx.qry.ssdiff = atoi(value);
259 } else if (!strcmp(name, "all")) {
260 ctx.qry.show_all = atoi(value);
257 } 261 }
258} 262}
259 263
260char *xstrdupn(const char *str) 264char *xstrdupn(const char *str)
261{ 265{
262 return (str ? xstrdup(str) : NULL); 266 return (str ? xstrdup(str) : NULL);
263} 267}
264 268
265static void prepare_context(struct cgit_context *ctx) 269static void prepare_context(struct cgit_context *ctx)
266{ 270{
267 memset(ctx, 0, sizeof(*ctx)); 271 memset(ctx, 0, sizeof(*ctx));
268 ctx->cfg.agefile = "info/web/last-modified"; 272 ctx->cfg.agefile = "info/web/last-modified";
269 ctx->cfg.nocache = 0; 273 ctx->cfg.nocache = 0;
270 ctx->cfg.cache_size = 0; 274 ctx->cfg.cache_size = 0;
271 ctx->cfg.cache_dynamic_ttl = 5; 275 ctx->cfg.cache_dynamic_ttl = 5;
272 ctx->cfg.cache_max_create_time = 5; 276 ctx->cfg.cache_max_create_time = 5;
273 ctx->cfg.cache_repo_ttl = 5; 277 ctx->cfg.cache_repo_ttl = 5;
274 ctx->cfg.cache_root = CGIT_CACHE_ROOT; 278 ctx->cfg.cache_root = CGIT_CACHE_ROOT;
275 ctx->cfg.cache_root_ttl = 5; 279 ctx->cfg.cache_root_ttl = 5;
276 ctx->cfg.cache_scanrc_ttl = 15; 280 ctx->cfg.cache_scanrc_ttl = 15;
277 ctx->cfg.cache_static_ttl = -1; 281 ctx->cfg.cache_static_ttl = -1;
278 ctx->cfg.css = "/cgit.css"; 282 ctx->cfg.css = "/cgit.css";
279 ctx->cfg.logo = "/cgit.png"; 283 ctx->cfg.logo = "/cgit.png";
280 ctx->cfg.local_time = 0; 284 ctx->cfg.local_time = 0;
281 ctx->cfg.enable_tree_linenumbers = 1; 285 ctx->cfg.enable_tree_linenumbers = 1;
282 ctx->cfg.max_repo_count = 50; 286 ctx->cfg.max_repo_count = 50;
283 ctx->cfg.max_commit_count = 50; 287 ctx->cfg.max_commit_count = 50;
284 ctx->cfg.max_lock_attempts = 5; 288 ctx->cfg.max_lock_attempts = 5;
285 ctx->cfg.max_msg_len = 80; 289 ctx->cfg.max_msg_len = 80;
286 ctx->cfg.max_repodesc_len = 80; 290 ctx->cfg.max_repodesc_len = 80;
287 ctx->cfg.max_blob_size = 0; 291 ctx->cfg.max_blob_size = 0;
288 ctx->cfg.max_stats = 0; 292 ctx->cfg.max_stats = 0;
289 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; 293 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
290 ctx->cfg.renamelimit = -1; 294 ctx->cfg.renamelimit = -1;
291 ctx->cfg.robots = "index, nofollow"; 295 ctx->cfg.robots = "index, nofollow";
292 ctx->cfg.root_title = "Git repository browser"; 296 ctx->cfg.root_title = "Git repository browser";
293 ctx->cfg.root_desc = "a fast webinterface for the git dscm"; 297 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
294 ctx->cfg.script_name = CGIT_SCRIPT_NAME; 298 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
295 ctx->cfg.section = ""; 299 ctx->cfg.section = "";
296 ctx->cfg.summary_branches = 10; 300 ctx->cfg.summary_branches = 10;
297 ctx->cfg.summary_log = 10; 301 ctx->cfg.summary_log = 10;
298 ctx->cfg.summary_tags = 10; 302 ctx->cfg.summary_tags = 10;
303 ctx->cfg.max_atom_items = 10;
299 ctx->cfg.ssdiff = 0; 304 ctx->cfg.ssdiff = 0;
300 ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG")); 305 ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
301 ctx->env.http_host = xstrdupn(getenv("HTTP_HOST")); 306 ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
302 ctx->env.https = xstrdupn(getenv("HTTPS")); 307 ctx->env.https = xstrdupn(getenv("HTTPS"));
303 ctx->env.no_http = xstrdupn(getenv("NO_HTTP")); 308 ctx->env.no_http = xstrdupn(getenv("NO_HTTP"));
304 ctx->env.path_info = xstrdupn(getenv("PATH_INFO")); 309 ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
305 ctx->env.query_string = xstrdupn(getenv("QUERY_STRING")); 310 ctx->env.query_string = xstrdupn(getenv("QUERY_STRING"));
306 ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD")); 311 ctx->env.request_method = xstrdupn(getenv("REQUEST_METHOD"));
307 ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME")); 312 ctx->env.script_name = xstrdupn(getenv("SCRIPT_NAME"));
308 ctx->env.server_name = xstrdupn(getenv("SERVER_NAME")); 313 ctx->env.server_name = xstrdupn(getenv("SERVER_NAME"));
309 ctx->env.server_port = xstrdupn(getenv("SERVER_PORT")); 314 ctx->env.server_port = xstrdupn(getenv("SERVER_PORT"));
310 ctx->page.mimetype = "text/html"; 315 ctx->page.mimetype = "text/html";
311 ctx->page.charset = PAGE_ENCODING; 316 ctx->page.charset = PAGE_ENCODING;
312 ctx->page.filename = NULL; 317 ctx->page.filename = NULL;
313 ctx->page.size = 0; 318 ctx->page.size = 0;
314 ctx->page.modified = time(NULL); 319 ctx->page.modified = time(NULL);
315 ctx->page.expires = ctx->page.modified; 320 ctx->page.expires = ctx->page.modified;
316 ctx->page.etag = NULL; 321 ctx->page.etag = NULL;
317 memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list)); 322 memset(&ctx->cfg.mimetypes, 0, sizeof(struct string_list));
318 if (ctx->env.script_name) 323 if (ctx->env.script_name)
319 ctx->cfg.script_name = ctx->env.script_name; 324 ctx->cfg.script_name = ctx->env.script_name;
320 if (ctx->env.query_string) 325 if (ctx->env.query_string)
321 ctx->qry.raw = ctx->env.query_string; 326 ctx->qry.raw = ctx->env.query_string;
322 if (!ctx->env.cgit_config) 327 if (!ctx->env.cgit_config)
323 ctx->env.cgit_config = CGIT_CONFIG; 328 ctx->env.cgit_config = CGIT_CONFIG;
324} 329}
325 330
326struct refmatch { 331struct refmatch {
327 char *req_ref; 332 char *req_ref;
328 char *first_ref; 333 char *first_ref;
329 int match; 334 int match;
330}; 335};
diff --git a/cgit.h b/cgit.h
index 9b1e3f8..8884f9e 100644
--- a/cgit.h
+++ b/cgit.h
@@ -117,103 +117,105 @@ struct refinfo {
117 struct taginfo *tag; 117 struct taginfo *tag;
118 struct commitinfo *commit; 118 struct commitinfo *commit;
119 }; 119 };
120}; 120};
121 121
122struct reflist { 122struct reflist {
123 struct refinfo **refs; 123 struct refinfo **refs;
124 int alloc; 124 int alloc;
125 int count; 125 int count;
126}; 126};
127 127
128struct cgit_query { 128struct cgit_query {
129 int has_symref; 129 int has_symref;
130 int has_sha1; 130 int has_sha1;
131 char *raw; 131 char *raw;
132 char *repo; 132 char *repo;
133 char *page; 133 char *page;
134 char *search; 134 char *search;
135 char *grep; 135 char *grep;
136 char *head; 136 char *head;
137 char *sha1; 137 char *sha1;
138 char *sha2; 138 char *sha2;
139 char *path; 139 char *path;
140 char *name; 140 char *name;
141 char *mimetype; 141 char *mimetype;
142 char *url; 142 char *url;
143 char *period; 143 char *period;
144 int ofs; 144 int ofs;
145 int nohead; 145 int nohead;
146 char *sort; 146 char *sort;
147 int showmsg; 147 int showmsg;
148 int ssdiff; 148 int ssdiff;
149 int show_all;
149}; 150};
150 151
151struct cgit_config { 152struct cgit_config {
152 char *agefile; 153 char *agefile;
153 char *cache_root; 154 char *cache_root;
154 char *clone_prefix; 155 char *clone_prefix;
155 char *css; 156 char *css;
156 char *favicon; 157 char *favicon;
157 char *footer; 158 char *footer;
158 char *head_include; 159 char *head_include;
159 char *header; 160 char *header;
160 char *index_header; 161 char *index_header;
161 char *index_info; 162 char *index_info;
162 char *logo; 163 char *logo;
163 char *logo_link; 164 char *logo_link;
164 char *module_link; 165 char *module_link;
165 char *robots; 166 char *robots;
166 char *root_title; 167 char *root_title;
167 char *root_desc; 168 char *root_desc;
168 char *root_readme; 169 char *root_readme;
169 char *script_name; 170 char *script_name;
170 char *section; 171 char *section;
171 char *virtual_root; 172 char *virtual_root;
172 int cache_size; 173 int cache_size;
173 int cache_dynamic_ttl; 174 int cache_dynamic_ttl;
174 int cache_max_create_time; 175 int cache_max_create_time;
175 int cache_repo_ttl; 176 int cache_repo_ttl;
176 int cache_root_ttl; 177 int cache_root_ttl;
177 int cache_scanrc_ttl; 178 int cache_scanrc_ttl;
178 int cache_static_ttl; 179 int cache_static_ttl;
179 int embedded; 180 int embedded;
180 int enable_filter_overrides; 181 int enable_filter_overrides;
181 int enable_index_links; 182 int enable_index_links;
182 int enable_log_filecount; 183 int enable_log_filecount;
183 int enable_log_linecount; 184 int enable_log_linecount;
184 int enable_remote_branches; 185 int enable_remote_branches;
185 int enable_subject_links; 186 int enable_subject_links;
186 int enable_tree_linenumbers; 187 int enable_tree_linenumbers;
187 int local_time; 188 int local_time;
189 int max_atom_items;
188 int max_repo_count; 190 int max_repo_count;
189 int max_commit_count; 191 int max_commit_count;
190 int max_lock_attempts; 192 int max_lock_attempts;
191 int max_msg_len; 193 int max_msg_len;
192 int max_repodesc_len; 194 int max_repodesc_len;
193 int max_blob_size; 195 int max_blob_size;
194 int max_stats; 196 int max_stats;
195 int nocache; 197 int nocache;
196 int noplainemail; 198 int noplainemail;
197 int noheader; 199 int noheader;
198 int renamelimit; 200 int renamelimit;
199 int snapshots; 201 int snapshots;
200 int summary_branches; 202 int summary_branches;
201 int summary_log; 203 int summary_log;
202 int summary_tags; 204 int summary_tags;
203 int ssdiff; 205 int ssdiff;
204 struct string_list mimetypes; 206 struct string_list mimetypes;
205 struct cgit_filter *about_filter; 207 struct cgit_filter *about_filter;
206 struct cgit_filter *commit_filter; 208 struct cgit_filter *commit_filter;
207 struct cgit_filter *source_filter; 209 struct cgit_filter *source_filter;
208}; 210};
209 211
210struct cgit_page { 212struct cgit_page {
211 time_t modified; 213 time_t modified;
212 time_t expires; 214 time_t expires;
213 size_t size; 215 size_t size;
214 char *mimetype; 216 char *mimetype;
215 char *charset; 217 char *charset;
216 char *filename; 218 char *filename;
217 char *etag; 219 char *etag;
218 char *title; 220 char *title;
219 int status; 221 int status;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index fcd4308..5c24381 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -143,64 +143,68 @@ header::
143 The content of the file specified with this option will be included 143 The content of the file specified with this option will be included
144 verbatim at the top of all pages. Default value: none. 144 verbatim at the top of all pages. Default value: none.
145 145
146include:: 146include::
147 Name of a configfile to include before the rest of the current config- 147 Name of a configfile to include before the rest of the current config-
148 file is parsed. Default value: none. 148 file is parsed. Default value: none.
149 149
150index-header:: 150index-header::
151 The content of the file specified with this option will be included 151 The content of the file specified with this option will be included
152 verbatim above the repository index. This setting is deprecated, and 152 verbatim above the repository index. This setting is deprecated, and
153 will not be supported by cgit-1.0 (use root-readme instead). Default 153 will not be supported by cgit-1.0 (use root-readme instead). Default
154 value: none. 154 value: none.
155 155
156index-info:: 156index-info::
157 The content of the file specified with this option will be included 157 The content of the file specified with this option will be included
158 verbatim below the heading on the repository index page. This setting 158 verbatim below the heading on the repository index page. This setting
159 is deprecated, and will not be supported by cgit-1.0 (use root-desc 159 is deprecated, and will not be supported by cgit-1.0 (use root-desc
160 instead). Default value: none. 160 instead). Default value: none.
161 161
162local-time:: 162local-time::
163 Flag which, if set to "1", makes cgit print commit and tag times in the 163 Flag which, if set to "1", makes cgit print commit and tag times in the
164 servers timezone. Default value: "0". 164 servers timezone. Default value: "0".
165 165
166logo:: 166logo::
167 Url which specifies the source of an image which will be used as a logo 167 Url which specifies the source of an image which will be used as a logo
168 on all cgit pages. Default value: "/cgit.png". 168 on all cgit pages. Default value: "/cgit.png".
169 169
170logo-link:: 170logo-link::
171 Url loaded when clicking on the cgit logo image. If unspecified the 171 Url loaded when clicking on the cgit logo image. If unspecified the
172 calculated url of the repository index page will be used. Default 172 calculated url of the repository index page will be used. Default
173 value: none. 173 value: none.
174 174
175max-atom-items::
176 Specifies the number of items to display in atom feeds view. Default
177 value: "10".
178
175max-commit-count:: 179max-commit-count::
176 Specifies the number of entries to list per page in "log" view. Default 180 Specifies the number of entries to list per page in "log" view. Default
177 value: "50". 181 value: "50".
178 182
179max-message-length:: 183max-message-length::
180 Specifies the maximum number of commit message characters to display in 184 Specifies the maximum number of commit message characters to display in
181 "log" view. Default value: "80". 185 "log" view. Default value: "80".
182 186
183max-repo-count:: 187max-repo-count::
184 Specifies the number of entries to list per page on therepository 188 Specifies the number of entries to list per page on therepository
185 index page. Default value: "50". 189 index page. Default value: "50".
186 190
187max-repodesc-length:: 191max-repodesc-length::
188 Specifies the maximum number of repo description characters to display 192 Specifies the maximum number of repo description characters to display
189 on the repository index page. Default value: "80". 193 on the repository index page. Default value: "80".
190 194
191max-blob-size:: 195max-blob-size::
192 Specifies the maximum size of a blob to display HTML for in KBytes. 196 Specifies the maximum size of a blob to display HTML for in KBytes.
193 Default value: "0" (limit disabled). 197 Default value: "0" (limit disabled).
194 198
195max-stats:: 199max-stats::
196 Set the default maximum statistics period. Valid values are "week", 200 Set the default maximum statistics period. Valid values are "week",
197 "month", "quarter" and "year". If unspecified, statistics are 201 "month", "quarter" and "year". If unspecified, statistics are
198 disabled. Default value: none. See also: "repo.max-stats". 202 disabled. Default value: none. See also: "repo.max-stats".
199 203
200mimetype.<ext>:: 204mimetype.<ext>::
201 Set the mimetype for the specified filename extension. This is used 205 Set the mimetype for the specified filename extension. This is used
202 by the `plain` command when returning blob content. 206 by the `plain` command when returning blob content.
203 207
204module-link:: 208module-link::
205 Text which will be used as the formatstring for a hyperlink when a 209 Text which will be used as the formatstring for a hyperlink when a
206 submodule is printed in a directory listing. The arguments for the 210 submodule is printed in a directory listing. The arguments for the
diff --git a/cmd.c b/cmd.c
index 766f903..ad784fc 100644
--- a/cmd.c
+++ b/cmd.c
@@ -4,65 +4,65 @@
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "cmd.h" 10#include "cmd.h"
11#include "cache.h" 11#include "cache.h"
12#include "ui-shared.h" 12#include "ui-shared.h"
13#include "ui-atom.h" 13#include "ui-atom.h"
14#include "ui-blob.h" 14#include "ui-blob.h"
15#include "ui-clone.h" 15#include "ui-clone.h"
16#include "ui-commit.h" 16#include "ui-commit.h"
17#include "ui-diff.h" 17#include "ui-diff.h"
18#include "ui-log.h" 18#include "ui-log.h"
19#include "ui-patch.h" 19#include "ui-patch.h"
20#include "ui-plain.h" 20#include "ui-plain.h"
21#include "ui-refs.h" 21#include "ui-refs.h"
22#include "ui-repolist.h" 22#include "ui-repolist.h"
23#include "ui-snapshot.h" 23#include "ui-snapshot.h"
24#include "ui-stats.h" 24#include "ui-stats.h"
25#include "ui-summary.h" 25#include "ui-summary.h"
26#include "ui-tag.h" 26#include "ui-tag.h"
27#include "ui-tree.h" 27#include "ui-tree.h"
28 28
29static void HEAD_fn(struct cgit_context *ctx) 29static 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, ctx->cfg.max_atom_items);
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(ctx->qry.path); 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);
55} 55}
56 56
57static void diff_fn(struct cgit_context *ctx) 57static void diff_fn(struct cgit_context *ctx)
58{ 58{
59 cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); 59 cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path);
60} 60}
61 61
62static void info_fn(struct cgit_context *ctx) 62static void info_fn(struct cgit_context *ctx)
63{ 63{
64 cgit_clone_info(ctx); 64 cgit_clone_info(ctx);
65} 65}
66 66
67static void log_fn(struct cgit_context *ctx) 67static void log_fn(struct cgit_context *ctx)
68{ 68{
diff --git a/ui-atom.c b/ui-atom.c
index 808b2d0..9f049ae 100644
--- a/ui-atom.c
+++ b/ui-atom.c
@@ -56,65 +56,67 @@ void add_entry(struct commit *commit, char *host)
56 html(cgit_httpscheme()); 56 html(cgit_httpscheme());
57 html_attr(host); 57 html_attr(host);
58 html_attr(cgit_pageurl(ctx.repo->url, "commit", NULL)); 58 html_attr(cgit_pageurl(ctx.repo->url, "commit", NULL));
59 if (ctx.cfg.virtual_root) 59 if (ctx.cfg.virtual_root)
60 delim = '?'; 60 delim = '?';
61 htmlf("%cid=%s", delim, hex); 61 htmlf("%cid=%s", delim, hex);
62 html("'/>\n"); 62 html("'/>\n");
63 } 63 }
64 htmlf("<id>%s</id>\n", hex); 64 htmlf("<id>%s</id>\n", hex);
65 html("<content type='text'>\n"); 65 html("<content type='text'>\n");
66 html_txt(info->msg); 66 html_txt(info->msg);
67 html("</content>\n"); 67 html("</content>\n");
68 html("<content type='xhtml'>\n"); 68 html("<content type='xhtml'>\n");
69 html("<div xmlns='http://www.w3.org/1999/xhtml'>\n"); 69 html("<div xmlns='http://www.w3.org/1999/xhtml'>\n");
70 html("<pre>\n"); 70 html("<pre>\n");
71 html_txt(info->msg); 71 html_txt(info->msg);
72 html("</pre>\n"); 72 html("</pre>\n");
73 html("</div>\n"); 73 html("</div>\n");
74 html("</content>\n"); 74 html("</content>\n");
75 html("</entry>\n"); 75 html("</entry>\n");
76 cgit_free_commitinfo(info); 76 cgit_free_commitinfo(info);
77} 77}
78 78
79 79
80void cgit_print_atom(char *tip, char *path, int max_count) 80void cgit_print_atom(char *tip, char *path, int max_count)
81{ 81{
82 char *host; 82 char *host;
83 const char *argv[] = {NULL, tip, NULL, NULL, NULL}; 83 const char *argv[] = {NULL, tip, NULL, NULL, NULL};
84 struct commit *commit; 84 struct commit *commit;
85 struct rev_info rev; 85 struct rev_info rev;
86 int argc = 2; 86 int argc = 2;
87 87
88 if (!tip) 88 if (ctx.qry.show_all)
89 argv[1] = "--all";
90 else if (!tip)
89 argv[1] = ctx.qry.head; 91 argv[1] = ctx.qry.head;
90 92
91 if (path) { 93 if (path) {
92 argv[argc++] = "--"; 94 argv[argc++] = "--";
93 argv[argc++] = path; 95 argv[argc++] = path;
94 } 96 }
95 97
96 init_revisions(&rev, NULL); 98 init_revisions(&rev, NULL);
97 rev.abbrev = DEFAULT_ABBREV; 99 rev.abbrev = DEFAULT_ABBREV;
98 rev.commit_format = CMIT_FMT_DEFAULT; 100 rev.commit_format = CMIT_FMT_DEFAULT;
99 rev.verbose_header = 1; 101 rev.verbose_header = 1;
100 rev.show_root_diff = 0; 102 rev.show_root_diff = 0;
101 rev.max_count = max_count; 103 rev.max_count = max_count;
102 setup_revisions(argc, argv, &rev, NULL); 104 setup_revisions(argc, argv, &rev, NULL);
103 prepare_revision_walk(&rev); 105 prepare_revision_walk(&rev);
104 106
105 host = cgit_hosturl(); 107 host = cgit_hosturl();
106 ctx.page.mimetype = "text/xml"; 108 ctx.page.mimetype = "text/xml";
107 ctx.page.charset = "utf-8"; 109 ctx.page.charset = "utf-8";
108 cgit_print_http_headers(&ctx); 110 cgit_print_http_headers(&ctx);
109 html("<feed xmlns='http://www.w3.org/2005/Atom'>\n"); 111 html("<feed xmlns='http://www.w3.org/2005/Atom'>\n");
110 html("<title>"); 112 html("<title>");
111 html_txt(ctx.repo->name); 113 html_txt(ctx.repo->name);
112 html("</title>\n"); 114 html("</title>\n");
113 html("<subtitle>"); 115 html("<subtitle>");
114 html_txt(ctx.repo->desc); 116 html_txt(ctx.repo->desc);
115 html("</subtitle>\n"); 117 html("</subtitle>\n");
116 if (host) { 118 if (host) {
117 html("<link rel='alternate' type='text/html' href='"); 119 html("<link rel='alternate' type='text/html' href='");
118 html(cgit_httpscheme()); 120 html(cgit_httpscheme());
119 html_attr(host); 121 html_attr(host);
120 html_attr(cgit_repourl(ctx.repo->url)); 122 html_attr(cgit_repourl(ctx.repo->url));