summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2010-06-19 09:42:12 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2010-06-19 09:42:12 (UTC)
commitc2766deb67acb1eae2b36dc0f5811a9cabb6db20 (patch) (unidiff)
tree463ea4a4388f2c449dec9eb49b33f9c0942030d1
parentcaf0825d97582d137387b8879867247e92cca022 (diff)
parent80476b0d2873eb212fad38487fd6189bd6629cbe (diff)
downloadcgit-c2766deb67acb1eae2b36dc0f5811a9cabb6db20.zip
cgit-c2766deb67acb1eae2b36dc0f5811a9cabb6db20.tar.gz
cgit-c2766deb67acb1eae2b36dc0f5811a9cabb6db20.tar.bz2
Merge branch 'ag/atom-fixes'
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
@@ -124,223 +124,228 @@ void config_cb(const char *name, const char *value)
124 else if (!strcmp(name, "virtual-root")) { 124 else if (!strcmp(name, "virtual-root")) {
125 ctx.cfg.virtual_root = trim_end(value, '/'); 125 ctx.cfg.virtual_root = trim_end(value, '/');
126 if (!ctx.cfg.virtual_root && (!strcmp(value, "/"))) 126 if (!ctx.cfg.virtual_root && (!strcmp(value, "/")))
127 ctx.cfg.virtual_root = ""; 127 ctx.cfg.virtual_root = "";
128 } else if (!strcmp(name, "nocache")) 128 } else if (!strcmp(name, "nocache"))
129 ctx.cfg.nocache = atoi(value); 129 ctx.cfg.nocache = atoi(value);
130 else if (!strcmp(name, "noplainemail")) 130 else if (!strcmp(name, "noplainemail"))
131 ctx.cfg.noplainemail = atoi(value); 131 ctx.cfg.noplainemail = atoi(value);
132 else if (!strcmp(name, "noheader")) 132 else if (!strcmp(name, "noheader"))
133 ctx.cfg.noheader = atoi(value); 133 ctx.cfg.noheader = atoi(value);
134 else if (!strcmp(name, "snapshots")) 134 else if (!strcmp(name, "snapshots"))
135 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); 135 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
136 else if (!strcmp(name, "enable-filter-overrides")) 136 else if (!strcmp(name, "enable-filter-overrides"))
137 ctx.cfg.enable_filter_overrides = atoi(value); 137 ctx.cfg.enable_filter_overrides = atoi(value);
138 else if (!strcmp(name, "enable-index-links")) 138 else if (!strcmp(name, "enable-index-links"))
139 ctx.cfg.enable_index_links = atoi(value); 139 ctx.cfg.enable_index_links = atoi(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"))
204 ctx.cfg.clone_prefix = xstrdup(value); 206 ctx.cfg.clone_prefix = xstrdup(value);
205 else if (!strcmp(name, "local-time")) 207 else if (!strcmp(name, "local-time"))
206 ctx.cfg.local_time = atoi(value); 208 ctx.cfg.local_time = atoi(value);
207 else if (!prefixcmp(name, "mimetype.")) 209 else if (!prefixcmp(name, "mimetype."))
208 add_mimetype(name + 9, value); 210 add_mimetype(name + 9, value);
209 else if (!strcmp(name, "include")) 211 else if (!strcmp(name, "include"))
210 parse_configfile(value, config_cb); 212 parse_configfile(value, config_cb);
211} 213}
212 214
213static void querystring_cb(const char *name, const char *value) 215static void querystring_cb(const char *name, const char *value)
214{ 216{
215 if (!value) 217 if (!value)
216 value = ""; 218 value = "";
217 219
218 if (!strcmp(name,"r")) { 220 if (!strcmp(name,"r")) {
219 ctx.qry.repo = xstrdup(value); 221 ctx.qry.repo = xstrdup(value);
220 ctx.repo = cgit_get_repoinfo(value); 222 ctx.repo = cgit_get_repoinfo(value);
221 } else if (!strcmp(name, "p")) { 223 } else if (!strcmp(name, "p")) {
222 ctx.qry.page = xstrdup(value); 224 ctx.qry.page = xstrdup(value);
223 } else if (!strcmp(name, "url")) { 225 } else if (!strcmp(name, "url")) {
224 if (*value == '/') 226 if (*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};
331 336
332int find_current_ref(const char *refname, const unsigned char *sha1, 337int find_current_ref(const char *refname, const unsigned char *sha1,
333 int flags, void *cb_data) 338 int flags, void *cb_data)
334{ 339{
335 struct refmatch *info; 340 struct refmatch *info;
336 341
337 info = (struct refmatch *)cb_data; 342 info = (struct refmatch *)cb_data;
338 if (!strcmp(refname, info->req_ref)) 343 if (!strcmp(refname, info->req_ref))
339 info->match = 1; 344 info->match = 1;
340 if (!info->first_ref) 345 if (!info->first_ref)
341 info->first_ref = xstrdup(refname); 346 info->first_ref = xstrdup(refname);
342 return info->match; 347 return info->match;
343} 348}
344 349
345char *find_default_branch(struct cgit_repo *repo) 350char *find_default_branch(struct cgit_repo *repo)
346{ 351{
diff --git a/cgit.h b/cgit.h
index 9b1e3f8..8884f9e 100644
--- a/cgit.h
+++ b/cgit.h
@@ -101,135 +101,137 @@ struct commitinfo {
101 char *subject; 101 char *subject;
102 char *msg; 102 char *msg;
103 char *msg_encoding; 103 char *msg_encoding;
104}; 104};
105 105
106struct taginfo { 106struct taginfo {
107 char *tagger; 107 char *tagger;
108 char *tagger_email; 108 char *tagger_email;
109 unsigned long tagger_date; 109 unsigned long tagger_date;
110 char *msg; 110 char *msg;
111}; 111};
112 112
113struct refinfo { 113struct refinfo {
114 const char *refname; 114 const char *refname;
115 struct object *object; 115 struct object *object;
116 union { 116 union {
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;
220 char *statusmsg; 222 char *statusmsg;
221}; 223};
222 224
223struct cgit_environment { 225struct cgit_environment {
224 char *cgit_config; 226 char *cgit_config;
225 char *http_host; 227 char *http_host;
226 char *https; 228 char *https;
227 char *no_http; 229 char *no_http;
228 char *path_info; 230 char *path_info;
229 char *query_string; 231 char *query_string;
230 char *request_method; 232 char *request_method;
231 char *script_name; 233 char *script_name;
232 char *server_name; 234 char *server_name;
233 char *server_port; 235 char *server_port;
234}; 236};
235 237
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index fcd4308..5c24381 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -127,96 +127,100 @@ enable-tree-linenumbers::
127 127
128favicon:: 128favicon::
129 Url used as link to a shortcut icon for cgit. If specified, it is 129 Url used as link to a shortcut icon for cgit. If specified, it is
130 suggested to use the value "/favicon.ico" since certain browsers will 130 suggested to use the value "/favicon.ico" since certain browsers will
131 ignore other values. Default value: none. 131 ignore other values. Default value: none.
132 132
133footer:: 133footer::
134 The content of the file specified with this option will be included 134 The content of the file specified with this option will be included
135 verbatim at the bottom of all pages (i.e. it replaces the standard 135 verbatim at the bottom of all pages (i.e. it replaces the standard
136 "generated by..." message. Default value: none. 136 "generated by..." message. Default value: none.
137 137
138head-include:: 138head-include::
139 The content of the file specified with this option will be included 139 The content of the file specified with this option will be included
140 verbatim in the html HEAD section on all pages. Default value: none. 140 verbatim in the html HEAD section on all pages. Default value: none.
141 141
142header:: 142header::
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
207 formatstring are the path and SHA1 of the submodule commit. Default 211 formatstring are the path and SHA1 of the submodule commit. Default
208 value: "./?repo=%s&page=commit&id=%s" 212 value: "./?repo=%s&page=commit&id=%s"
209 213
210nocache:: 214nocache::
211 If set to the value "1" caching will be disabled. This settings is 215 If set to the value "1" caching will be disabled. This settings is
212 deprecated, and will not be honored starting with cgit-1.0. Default 216 deprecated, and will not be honored starting with cgit-1.0. Default
213 value: "0". 217 value: "0".
214 218
215noplainemail:: 219noplainemail::
216 If set to "1" showing full author email adresses will be disabled. 220 If set to "1" showing full author email adresses will be disabled.
217 Default value: "0". 221 Default value: "0".
218 222
219noheader:: 223noheader::
220 Flag which, when set to "1", will make cgit omit the standard header 224 Flag which, when set to "1", will make cgit omit the standard header
221 on all pages. Default value: none. See also: "embedded". 225 on all pages. Default value: none. See also: "embedded".
222 226
diff --git a/cmd.c b/cmd.c
index 766f903..ad784fc 100644
--- a/cmd.c
+++ b/cmd.c
@@ -1,84 +1,84 @@
1/* cmd.c: the cgit command dispatcher 1/* cmd.c: the cgit command dispatcher
2 * 2 *
3 * Copyright (C) 2008 Lars Hjemli 3 * Copyright (C) 2008 Lars Hjemli
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{
69 cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count, 69 cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count,
70 ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1); 70 ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1);
71} 71}
72 72
73static void ls_cache_fn(struct cgit_context *ctx) 73static void ls_cache_fn(struct cgit_context *ctx)
74{ 74{
75 ctx->page.mimetype = "text/plain"; 75 ctx->page.mimetype = "text/plain";
76 ctx->page.filename = "ls-cache.txt"; 76 ctx->page.filename = "ls-cache.txt";
77 cgit_print_http_headers(ctx); 77 cgit_print_http_headers(ctx);
78 cache_ls(ctx->cfg.cache_root); 78 cache_ls(ctx->cfg.cache_root);
79} 79}
80 80
81static void objects_fn(struct cgit_context *ctx) 81static void objects_fn(struct cgit_context *ctx)
82{ 82{
83 cgit_clone_objects(ctx); 83 cgit_clone_objects(ctx);
84} 84}
diff --git a/ui-atom.c b/ui-atom.c
index 808b2d0..9f049ae 100644
--- a/ui-atom.c
+++ b/ui-atom.c
@@ -40,92 +40,94 @@ void add_entry(struct commit *commit, char *host)
40 else 40 else
41 t = mail; 41 t = mail;
42 t2 = strchr(t, '>'); 42 t2 = strchr(t, '>');
43 if (t2) 43 if (t2)
44 *t2 = '\0'; 44 *t2 = '\0';
45 html("<email>"); 45 html("<email>");
46 html_txt(t); 46 html_txt(t);
47 html("</email>\n"); 47 html("</email>\n");
48 free(mail); 48 free(mail);
49 } 49 }
50 html("</author>\n"); 50 html("</author>\n");
51 html("<published>"); 51 html("<published>");
52 cgit_print_date(info->author_date, FMT_ATOMDATE, ctx.cfg.local_time); 52 cgit_print_date(info->author_date, FMT_ATOMDATE, ctx.cfg.local_time);
53 html("</published>\n"); 53 html("</published>\n");
54 if (host) { 54 if (host) {
55 html("<link rel='alternate' type='text/html' href='"); 55 html("<link rel='alternate' type='text/html' href='");
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));
121 html("'/>\n"); 123 html("'/>\n");
122 } 124 }
123 while ((commit = get_revision(&rev)) != NULL) { 125 while ((commit = get_revision(&rev)) != NULL) {
124 add_entry(commit, host); 126 add_entry(commit, host);
125 free(commit->buffer); 127 free(commit->buffer);
126 commit->buffer = NULL; 128 commit->buffer = NULL;
127 free_commit_list(commit->parents); 129 free_commit_list(commit->parents);
128 commit->parents = NULL; 130 commit->parents = NULL;
129 } 131 }
130 html("</feed>\n"); 132 html("</feed>\n");
131} 133}