author | Johan Herland <johan@herland.net> | 2010-06-10 18:15:51 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2010-06-19 11:00:07 (UTC) |
commit | d20313e3daf855ee5d4808e050f54614c200d7b1 (patch) (unidiff) | |
tree | 5c462f3ba6ec97c0b099a309dfd0fa87d03fbc72 /ui-shared.c | |
parent | 6180e6169d6e87a3bea7e4da835dca17f93e5cfd (diff) | |
download | cgit-d20313e3daf855ee5d4808e050f54614c200d7b1.zip cgit-d20313e3daf855ee5d4808e050f54614c200d7b1.tar.gz cgit-d20313e3daf855ee5d4808e050f54614c200d7b1.tar.bz2 |
ui-diff: Add links to increase/decrease number of context lines in diffs
Add two links to the "Diffstat" line to show more/less context lines in the
generated diff.
To support this, cgit_commit_link() and cgit_diff_link() has learned to
preserve the ctx.qry.context variable.
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | ui-shared.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/ui-shared.c b/ui-shared.c index e991799..c99bcec 100644 --- a/ui-shared.c +++ b/ui-shared.c | |||
@@ -152,425 +152,439 @@ static void site_url(const char *page, const char *search, int ofs) | |||
152 | html(delim); | 152 | html(delim); |
153 | html("q="); | 153 | html("q="); |
154 | html_attr(search); | 154 | html_attr(search); |
155 | delim = "&"; | 155 | delim = "&"; |
156 | } | 156 | } |
157 | if (ofs) { | 157 | if (ofs) { |
158 | html(delim); | 158 | html(delim); |
159 | htmlf("ofs=%d", ofs); | 159 | htmlf("ofs=%d", ofs); |
160 | } | 160 | } |
161 | } | 161 | } |
162 | 162 | ||
163 | static void site_link(const char *page, const char *name, const char *title, | 163 | static void site_link(const char *page, const char *name, const char *title, |
164 | const char *class, const char *search, int ofs) | 164 | const char *class, const char *search, int ofs) |
165 | { | 165 | { |
166 | html("<a"); | 166 | html("<a"); |
167 | if (title) { | 167 | if (title) { |
168 | html(" title='"); | 168 | html(" title='"); |
169 | html_attr(title); | 169 | html_attr(title); |
170 | html("'"); | 170 | html("'"); |
171 | } | 171 | } |
172 | if (class) { | 172 | if (class) { |
173 | html(" class='"); | 173 | html(" class='"); |
174 | html_attr(class); | 174 | html_attr(class); |
175 | html("'"); | 175 | html("'"); |
176 | } | 176 | } |
177 | html(" href='"); | 177 | html(" href='"); |
178 | site_url(page, search, ofs); | 178 | site_url(page, search, ofs); |
179 | html("'>"); | 179 | html("'>"); |
180 | html_txt(name); | 180 | html_txt(name); |
181 | html("</a>"); | 181 | html("</a>"); |
182 | } | 182 | } |
183 | 183 | ||
184 | void cgit_index_link(const char *name, const char *title, const char *class, | 184 | void cgit_index_link(const char *name, const char *title, const char *class, |
185 | const char *pattern, int ofs) | 185 | const char *pattern, int ofs) |
186 | { | 186 | { |
187 | site_link(NULL, name, title, class, pattern, ofs); | 187 | site_link(NULL, name, title, class, pattern, ofs); |
188 | } | 188 | } |
189 | 189 | ||
190 | static char *repolink(const char *title, const char *class, const char *page, | 190 | static char *repolink(const char *title, const char *class, const char *page, |
191 | const char *head, const char *path) | 191 | const char *head, const char *path) |
192 | { | 192 | { |
193 | char *delim = "?"; | 193 | char *delim = "?"; |
194 | 194 | ||
195 | html("<a"); | 195 | html("<a"); |
196 | if (title) { | 196 | if (title) { |
197 | html(" title='"); | 197 | html(" title='"); |
198 | html_attr(title); | 198 | html_attr(title); |
199 | html("'"); | 199 | html("'"); |
200 | } | 200 | } |
201 | if (class) { | 201 | if (class) { |
202 | html(" class='"); | 202 | html(" class='"); |
203 | html_attr(class); | 203 | html_attr(class); |
204 | html("'"); | 204 | html("'"); |
205 | } | 205 | } |
206 | html(" href='"); | 206 | html(" href='"); |
207 | if (ctx.cfg.virtual_root) { | 207 | if (ctx.cfg.virtual_root) { |
208 | html_url_path(ctx.cfg.virtual_root); | 208 | html_url_path(ctx.cfg.virtual_root); |
209 | if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') | 209 | if (ctx.cfg.virtual_root[strlen(ctx.cfg.virtual_root) - 1] != '/') |
210 | html("/"); | 210 | html("/"); |
211 | html_url_path(ctx.repo->url); | 211 | html_url_path(ctx.repo->url); |
212 | if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') | 212 | if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') |
213 | html("/"); | 213 | html("/"); |
214 | if (page) { | 214 | if (page) { |
215 | html_url_path(page); | 215 | html_url_path(page); |
216 | html("/"); | 216 | html("/"); |
217 | if (path) | 217 | if (path) |
218 | html_url_path(path); | 218 | html_url_path(path); |
219 | } | 219 | } |
220 | } else { | 220 | } else { |
221 | html(ctx.cfg.script_name); | 221 | html(ctx.cfg.script_name); |
222 | html("?url="); | 222 | html("?url="); |
223 | html_url_arg(ctx.repo->url); | 223 | html_url_arg(ctx.repo->url); |
224 | if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') | 224 | if (ctx.repo->url[strlen(ctx.repo->url) - 1] != '/') |
225 | html("/"); | 225 | html("/"); |
226 | if (page) { | 226 | if (page) { |
227 | html_url_arg(page); | 227 | html_url_arg(page); |
228 | html("/"); | 228 | html("/"); |
229 | if (path) | 229 | if (path) |
230 | html_url_arg(path); | 230 | html_url_arg(path); |
231 | } | 231 | } |
232 | delim = "&"; | 232 | delim = "&"; |
233 | } | 233 | } |
234 | if (head && strcmp(head, ctx.repo->defbranch)) { | 234 | if (head && strcmp(head, ctx.repo->defbranch)) { |
235 | html(delim); | 235 | html(delim); |
236 | html("h="); | 236 | html("h="); |
237 | html_url_arg(head); | 237 | html_url_arg(head); |
238 | delim = "&"; | 238 | delim = "&"; |
239 | } | 239 | } |
240 | return fmt("%s", delim); | 240 | return fmt("%s", delim); |
241 | } | 241 | } |
242 | 242 | ||
243 | static void reporevlink(const char *page, const char *name, const char *title, | 243 | static void reporevlink(const char *page, const char *name, const char *title, |
244 | const char *class, const char *head, const char *rev, | 244 | const char *class, const char *head, const char *rev, |
245 | const char *path) | 245 | const char *path) |
246 | { | 246 | { |
247 | char *delim; | 247 | char *delim; |
248 | 248 | ||
249 | delim = repolink(title, class, page, head, path); | 249 | delim = repolink(title, class, page, head, path); |
250 | if (rev && ctx.qry.head != NULL && strcmp(rev, ctx.qry.head)) { | 250 | if (rev && ctx.qry.head != NULL && strcmp(rev, ctx.qry.head)) { |
251 | html(delim); | 251 | html(delim); |
252 | html("id="); | 252 | html("id="); |
253 | html_url_arg(rev); | 253 | html_url_arg(rev); |
254 | } | 254 | } |
255 | html("'>"); | 255 | html("'>"); |
256 | html_txt(name); | 256 | html_txt(name); |
257 | html("</a>"); | 257 | html("</a>"); |
258 | } | 258 | } |
259 | 259 | ||
260 | void cgit_summary_link(const char *name, const char *title, const char *class, | 260 | void cgit_summary_link(const char *name, const char *title, const char *class, |
261 | const char *head) | 261 | const char *head) |
262 | { | 262 | { |
263 | reporevlink(NULL, name, title, class, head, NULL, NULL); | 263 | reporevlink(NULL, name, title, class, head, NULL, NULL); |
264 | } | 264 | } |
265 | 265 | ||
266 | void cgit_tag_link(const char *name, const char *title, const char *class, | 266 | void cgit_tag_link(const char *name, const char *title, const char *class, |
267 | const char *head, const char *rev) | 267 | const char *head, const char *rev) |
268 | { | 268 | { |
269 | reporevlink("tag", name, title, class, head, rev, NULL); | 269 | reporevlink("tag", name, title, class, head, rev, NULL); |
270 | } | 270 | } |
271 | 271 | ||
272 | void cgit_tree_link(const char *name, const char *title, const char *class, | 272 | void cgit_tree_link(const char *name, const char *title, const char *class, |
273 | const char *head, const char *rev, const char *path) | 273 | const char *head, const char *rev, const char *path) |
274 | { | 274 | { |
275 | reporevlink("tree", name, title, class, head, rev, path); | 275 | reporevlink("tree", name, title, class, head, rev, path); |
276 | } | 276 | } |
277 | 277 | ||
278 | void cgit_plain_link(const char *name, const char *title, const char *class, | 278 | void cgit_plain_link(const char *name, const char *title, const char *class, |
279 | const char *head, const char *rev, const char *path) | 279 | const char *head, const char *rev, const char *path) |
280 | { | 280 | { |
281 | reporevlink("plain", name, title, class, head, rev, path); | 281 | reporevlink("plain", name, title, class, head, rev, path); |
282 | } | 282 | } |
283 | 283 | ||
284 | void cgit_log_link(const char *name, const char *title, const char *class, | 284 | void cgit_log_link(const char *name, const char *title, const char *class, |
285 | const char *head, const char *rev, const char *path, | 285 | const char *head, const char *rev, const char *path, |
286 | int ofs, const char *grep, const char *pattern, int showmsg) | 286 | int ofs, const char *grep, const char *pattern, int showmsg) |
287 | { | 287 | { |
288 | char *delim; | 288 | char *delim; |
289 | 289 | ||
290 | delim = repolink(title, class, "log", head, path); | 290 | delim = repolink(title, class, "log", head, path); |
291 | if (rev && strcmp(rev, ctx.qry.head)) { | 291 | if (rev && strcmp(rev, ctx.qry.head)) { |
292 | html(delim); | 292 | html(delim); |
293 | html("id="); | 293 | html("id="); |
294 | html_url_arg(rev); | 294 | html_url_arg(rev); |
295 | delim = "&"; | 295 | delim = "&"; |
296 | } | 296 | } |
297 | if (grep && pattern) { | 297 | if (grep && pattern) { |
298 | html(delim); | 298 | html(delim); |
299 | html("qt="); | 299 | html("qt="); |
300 | html_url_arg(grep); | 300 | html_url_arg(grep); |
301 | delim = "&"; | 301 | delim = "&"; |
302 | html(delim); | 302 | html(delim); |
303 | html("q="); | 303 | html("q="); |
304 | html_url_arg(pattern); | 304 | html_url_arg(pattern); |
305 | } | 305 | } |
306 | if (ofs > 0) { | 306 | if (ofs > 0) { |
307 | html(delim); | 307 | html(delim); |
308 | html("ofs="); | 308 | html("ofs="); |
309 | htmlf("%d", ofs); | 309 | htmlf("%d", ofs); |
310 | delim = "&"; | 310 | delim = "&"; |
311 | } | 311 | } |
312 | if (showmsg) { | 312 | if (showmsg) { |
313 | html(delim); | 313 | html(delim); |
314 | html("showmsg=1"); | 314 | html("showmsg=1"); |
315 | } | 315 | } |
316 | html("'>"); | 316 | html("'>"); |
317 | html_txt(name); | 317 | html_txt(name); |
318 | html("</a>"); | 318 | html("</a>"); |
319 | } | 319 | } |
320 | 320 | ||
321 | void cgit_commit_link(char *name, const char *title, const char *class, | 321 | void cgit_commit_link(char *name, const char *title, const char *class, |
322 | const char *head, const char *rev, const char *path, | 322 | const char *head, const char *rev, const char *path, |
323 | int toggle_ssdiff) | 323 | int toggle_ssdiff) |
324 | { | 324 | { |
325 | if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) { | 325 | if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) { |
326 | name[ctx.cfg.max_msg_len] = '\0'; | 326 | name[ctx.cfg.max_msg_len] = '\0'; |
327 | name[ctx.cfg.max_msg_len - 1] = '.'; | 327 | name[ctx.cfg.max_msg_len - 1] = '.'; |
328 | name[ctx.cfg.max_msg_len - 2] = '.'; | 328 | name[ctx.cfg.max_msg_len - 2] = '.'; |
329 | name[ctx.cfg.max_msg_len - 3] = '.'; | 329 | name[ctx.cfg.max_msg_len - 3] = '.'; |
330 | } | 330 | } |
331 | 331 | ||
332 | char *delim; | 332 | char *delim; |
333 | 333 | ||
334 | delim = repolink(title, class, "commit", head, path); | 334 | delim = repolink(title, class, "commit", head, path); |
335 | if (rev && strcmp(rev, ctx.qry.head)) { | 335 | if (rev && strcmp(rev, ctx.qry.head)) { |
336 | html(delim); | 336 | html(delim); |
337 | html("id="); | 337 | html("id="); |
338 | html_url_arg(rev); | 338 | html_url_arg(rev); |
339 | delim = "&"; | 339 | delim = "&"; |
340 | } | 340 | } |
341 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { | 341 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { |
342 | html(delim); | 342 | html(delim); |
343 | html("ss=1"); | 343 | html("ss=1"); |
344 | delim = "&"; | ||
345 | } | ||
346 | if (ctx.qry.context > 0 && ctx.qry.context != 3) { | ||
347 | html(delim); | ||
348 | html("context="); | ||
349 | htmlf("%d", ctx.qry.context); | ||
350 | delim = "&"; | ||
344 | } | 351 | } |
345 | html("'>"); | 352 | html("'>"); |
346 | html_txt(name); | 353 | html_txt(name); |
347 | html("</a>"); | 354 | html("</a>"); |
348 | } | 355 | } |
349 | 356 | ||
350 | void cgit_refs_link(const char *name, const char *title, const char *class, | 357 | void cgit_refs_link(const char *name, const char *title, const char *class, |
351 | const char *head, const char *rev, const char *path) | 358 | const char *head, const char *rev, const char *path) |
352 | { | 359 | { |
353 | reporevlink("refs", name, title, class, head, rev, path); | 360 | reporevlink("refs", name, title, class, head, rev, path); |
354 | } | 361 | } |
355 | 362 | ||
356 | void cgit_snapshot_link(const char *name, const char *title, const char *class, | 363 | void cgit_snapshot_link(const char *name, const char *title, const char *class, |
357 | const char *head, const char *rev, | 364 | const char *head, const char *rev, |
358 | const char *archivename) | 365 | const char *archivename) |
359 | { | 366 | { |
360 | reporevlink("snapshot", name, title, class, head, rev, archivename); | 367 | reporevlink("snapshot", name, title, class, head, rev, archivename); |
361 | } | 368 | } |
362 | 369 | ||
363 | void cgit_diff_link(const char *name, const char *title, const char *class, | 370 | void cgit_diff_link(const char *name, const char *title, const char *class, |
364 | const char *head, const char *new_rev, const char *old_rev, | 371 | const char *head, const char *new_rev, const char *old_rev, |
365 | const char *path, int toggle_ssdiff) | 372 | const char *path, int toggle_ssdiff) |
366 | { | 373 | { |
367 | char *delim; | 374 | char *delim; |
368 | 375 | ||
369 | delim = repolink(title, class, "diff", head, path); | 376 | delim = repolink(title, class, "diff", head, path); |
370 | if (new_rev && ctx.qry.head != NULL && strcmp(new_rev, ctx.qry.head)) { | 377 | if (new_rev && ctx.qry.head != NULL && strcmp(new_rev, ctx.qry.head)) { |
371 | html(delim); | 378 | html(delim); |
372 | html("id="); | 379 | html("id="); |
373 | html_url_arg(new_rev); | 380 | html_url_arg(new_rev); |
374 | delim = "&"; | 381 | delim = "&"; |
375 | } | 382 | } |
376 | if (old_rev) { | 383 | if (old_rev) { |
377 | html(delim); | 384 | html(delim); |
378 | html("id2="); | 385 | html("id2="); |
379 | html_url_arg(old_rev); | 386 | html_url_arg(old_rev); |
380 | delim = "&"; | 387 | delim = "&"; |
381 | } | 388 | } |
382 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { | 389 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { |
383 | html(delim); | 390 | html(delim); |
384 | html("ss=1"); | 391 | html("ss=1"); |
392 | delim = "&"; | ||
393 | } | ||
394 | if (ctx.qry.context > 0 && ctx.qry.context != 3) { | ||
395 | html(delim); | ||
396 | html("context="); | ||
397 | htmlf("%d", ctx.qry.context); | ||
398 | delim = "&"; | ||
385 | } | 399 | } |
386 | html("'>"); | 400 | html("'>"); |
387 | html_txt(name); | 401 | html_txt(name); |
388 | html("</a>"); | 402 | html("</a>"); |
389 | } | 403 | } |
390 | 404 | ||
391 | void cgit_patch_link(const char *name, const char *title, const char *class, | 405 | void cgit_patch_link(const char *name, const char *title, const char *class, |
392 | const char *head, const char *rev, const char *path) | 406 | const char *head, const char *rev, const char *path) |
393 | { | 407 | { |
394 | reporevlink("patch", name, title, class, head, rev, path); | 408 | reporevlink("patch", name, title, class, head, rev, path); |
395 | } | 409 | } |
396 | 410 | ||
397 | void cgit_stats_link(const char *name, const char *title, const char *class, | 411 | void cgit_stats_link(const char *name, const char *title, const char *class, |
398 | const char *head, const char *path) | 412 | const char *head, const char *path) |
399 | { | 413 | { |
400 | reporevlink("stats", name, title, class, head, NULL, path); | 414 | reporevlink("stats", name, title, class, head, NULL, path); |
401 | } | 415 | } |
402 | 416 | ||
403 | void cgit_self_link(char *name, const char *title, const char *class, | 417 | void cgit_self_link(char *name, const char *title, const char *class, |
404 | struct cgit_context *ctx) | 418 | struct cgit_context *ctx) |
405 | { | 419 | { |
406 | if (!strcmp(ctx->qry.page, "repolist")) | 420 | if (!strcmp(ctx->qry.page, "repolist")) |
407 | return cgit_index_link(name, title, class, ctx->qry.search, | 421 | return cgit_index_link(name, title, class, ctx->qry.search, |
408 | ctx->qry.ofs); | 422 | ctx->qry.ofs); |
409 | else if (!strcmp(ctx->qry.page, "summary")) | 423 | else if (!strcmp(ctx->qry.page, "summary")) |
410 | return cgit_summary_link(name, title, class, ctx->qry.head); | 424 | return cgit_summary_link(name, title, class, ctx->qry.head); |
411 | else if (!strcmp(ctx->qry.page, "tag")) | 425 | else if (!strcmp(ctx->qry.page, "tag")) |
412 | return cgit_tag_link(name, title, class, ctx->qry.head, | 426 | return cgit_tag_link(name, title, class, ctx->qry.head, |
413 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL); | 427 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL); |
414 | else if (!strcmp(ctx->qry.page, "tree")) | 428 | else if (!strcmp(ctx->qry.page, "tree")) |
415 | return cgit_tree_link(name, title, class, ctx->qry.head, | 429 | return cgit_tree_link(name, title, class, ctx->qry.head, |
416 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 430 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, |
417 | ctx->qry.path); | 431 | ctx->qry.path); |
418 | else if (!strcmp(ctx->qry.page, "plain")) | 432 | else if (!strcmp(ctx->qry.page, "plain")) |
419 | return cgit_plain_link(name, title, class, ctx->qry.head, | 433 | return cgit_plain_link(name, title, class, ctx->qry.head, |
420 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 434 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, |
421 | ctx->qry.path); | 435 | ctx->qry.path); |
422 | else if (!strcmp(ctx->qry.page, "log")) | 436 | else if (!strcmp(ctx->qry.page, "log")) |
423 | return cgit_log_link(name, title, class, ctx->qry.head, | 437 | return cgit_log_link(name, title, class, ctx->qry.head, |
424 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 438 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, |
425 | ctx->qry.path, ctx->qry.ofs, | 439 | ctx->qry.path, ctx->qry.ofs, |
426 | ctx->qry.grep, ctx->qry.search, | 440 | ctx->qry.grep, ctx->qry.search, |
427 | ctx->qry.showmsg); | 441 | ctx->qry.showmsg); |
428 | else if (!strcmp(ctx->qry.page, "commit")) | 442 | else if (!strcmp(ctx->qry.page, "commit")) |
429 | return cgit_commit_link(name, title, class, ctx->qry.head, | 443 | return cgit_commit_link(name, title, class, ctx->qry.head, |
430 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 444 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, |
431 | ctx->qry.path, 0); | 445 | ctx->qry.path, 0); |
432 | else if (!strcmp(ctx->qry.page, "patch")) | 446 | else if (!strcmp(ctx->qry.page, "patch")) |
433 | return cgit_patch_link(name, title, class, ctx->qry.head, | 447 | return cgit_patch_link(name, title, class, ctx->qry.head, |
434 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 448 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, |
435 | ctx->qry.path); | 449 | ctx->qry.path); |
436 | else if (!strcmp(ctx->qry.page, "refs")) | 450 | else if (!strcmp(ctx->qry.page, "refs")) |
437 | return cgit_refs_link(name, title, class, ctx->qry.head, | 451 | return cgit_refs_link(name, title, class, ctx->qry.head, |
438 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 452 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, |
439 | ctx->qry.path); | 453 | ctx->qry.path); |
440 | else if (!strcmp(ctx->qry.page, "snapshot")) | 454 | else if (!strcmp(ctx->qry.page, "snapshot")) |
441 | return cgit_snapshot_link(name, title, class, ctx->qry.head, | 455 | return cgit_snapshot_link(name, title, class, ctx->qry.head, |
442 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | 456 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, |
443 | ctx->qry.path); | 457 | ctx->qry.path); |
444 | else if (!strcmp(ctx->qry.page, "diff")) | 458 | else if (!strcmp(ctx->qry.page, "diff")) |
445 | return cgit_diff_link(name, title, class, ctx->qry.head, | 459 | return cgit_diff_link(name, title, class, ctx->qry.head, |
446 | ctx->qry.sha1, ctx->qry.sha2, | 460 | ctx->qry.sha1, ctx->qry.sha2, |
447 | ctx->qry.path, 0); | 461 | ctx->qry.path, 0); |
448 | else if (!strcmp(ctx->qry.page, "stats")) | 462 | else if (!strcmp(ctx->qry.page, "stats")) |
449 | return cgit_stats_link(name, title, class, ctx->qry.head, | 463 | return cgit_stats_link(name, title, class, ctx->qry.head, |
450 | ctx->qry.path); | 464 | ctx->qry.path); |
451 | 465 | ||
452 | /* Don't known how to make link for this page */ | 466 | /* Don't known how to make link for this page */ |
453 | repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path); | 467 | repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path); |
454 | html("><!-- cgit_self_link() doesn't know how to make link for page '"); | 468 | html("><!-- cgit_self_link() doesn't know how to make link for page '"); |
455 | html_txt(ctx->qry.page); | 469 | html_txt(ctx->qry.page); |
456 | html("' -->"); | 470 | html("' -->"); |
457 | html_txt(name); | 471 | html_txt(name); |
458 | html("</a>"); | 472 | html("</a>"); |
459 | } | 473 | } |
460 | 474 | ||
461 | void cgit_object_link(struct object *obj) | 475 | void cgit_object_link(struct object *obj) |
462 | { | 476 | { |
463 | char *page, *shortrev, *fullrev, *name; | 477 | char *page, *shortrev, *fullrev, *name; |
464 | 478 | ||
465 | fullrev = sha1_to_hex(obj->sha1); | 479 | fullrev = sha1_to_hex(obj->sha1); |
466 | shortrev = xstrdup(fullrev); | 480 | shortrev = xstrdup(fullrev); |
467 | shortrev[10] = '\0'; | 481 | shortrev[10] = '\0'; |
468 | if (obj->type == OBJ_COMMIT) { | 482 | if (obj->type == OBJ_COMMIT) { |
469 | cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, | 483 | cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, |
470 | ctx.qry.head, fullrev, NULL, 0); | 484 | ctx.qry.head, fullrev, NULL, 0); |
471 | return; | 485 | return; |
472 | } else if (obj->type == OBJ_TREE) | 486 | } else if (obj->type == OBJ_TREE) |
473 | page = "tree"; | 487 | page = "tree"; |
474 | else if (obj->type == OBJ_TAG) | 488 | else if (obj->type == OBJ_TAG) |
475 | page = "tag"; | 489 | page = "tag"; |
476 | else | 490 | else |
477 | page = "blob"; | 491 | page = "blob"; |
478 | name = fmt("%s %s...", typename(obj->type), shortrev); | 492 | name = fmt("%s %s...", typename(obj->type), shortrev); |
479 | reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); | 493 | reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); |
480 | } | 494 | } |
481 | 495 | ||
482 | void cgit_print_date(time_t secs, const char *format, int local_time) | 496 | void cgit_print_date(time_t secs, const char *format, int local_time) |
483 | { | 497 | { |
484 | char buf[64]; | 498 | char buf[64]; |
485 | struct tm *time; | 499 | struct tm *time; |
486 | 500 | ||
487 | if (!secs) | 501 | if (!secs) |
488 | return; | 502 | return; |
489 | if(local_time) | 503 | if(local_time) |
490 | time = localtime(&secs); | 504 | time = localtime(&secs); |
491 | else | 505 | else |
492 | time = gmtime(&secs); | 506 | time = gmtime(&secs); |
493 | strftime(buf, sizeof(buf)-1, format, time); | 507 | strftime(buf, sizeof(buf)-1, format, time); |
494 | html_txt(buf); | 508 | html_txt(buf); |
495 | } | 509 | } |
496 | 510 | ||
497 | void cgit_print_age(time_t t, time_t max_relative, const char *format) | 511 | void cgit_print_age(time_t t, time_t max_relative, const char *format) |
498 | { | 512 | { |
499 | time_t now, secs; | 513 | time_t now, secs; |
500 | 514 | ||
501 | if (!t) | 515 | if (!t) |
502 | return; | 516 | return; |
503 | time(&now); | 517 | time(&now); |
504 | secs = now - t; | 518 | secs = now - t; |
505 | 519 | ||
506 | if (secs > max_relative && max_relative >= 0) { | 520 | if (secs > max_relative && max_relative >= 0) { |
507 | cgit_print_date(t, format, ctx.cfg.local_time); | 521 | cgit_print_date(t, format, ctx.cfg.local_time); |
508 | return; | 522 | return; |
509 | } | 523 | } |
510 | 524 | ||
511 | if (secs < TM_HOUR * 2) { | 525 | if (secs < TM_HOUR * 2) { |
512 | htmlf("<span class='age-mins'>%.0f min.</span>", | 526 | htmlf("<span class='age-mins'>%.0f min.</span>", |
513 | secs * 1.0 / TM_MIN); | 527 | secs * 1.0 / TM_MIN); |
514 | return; | 528 | return; |
515 | } | 529 | } |
516 | if (secs < TM_DAY * 2) { | 530 | if (secs < TM_DAY * 2) { |
517 | htmlf("<span class='age-hours'>%.0f hours</span>", | 531 | htmlf("<span class='age-hours'>%.0f hours</span>", |
518 | secs * 1.0 / TM_HOUR); | 532 | secs * 1.0 / TM_HOUR); |
519 | return; | 533 | return; |
520 | } | 534 | } |
521 | if (secs < TM_WEEK * 2) { | 535 | if (secs < TM_WEEK * 2) { |
522 | htmlf("<span class='age-days'>%.0f days</span>", | 536 | htmlf("<span class='age-days'>%.0f days</span>", |
523 | secs * 1.0 / TM_DAY); | 537 | secs * 1.0 / TM_DAY); |
524 | return; | 538 | return; |
525 | } | 539 | } |
526 | if (secs < TM_MONTH * 2) { | 540 | if (secs < TM_MONTH * 2) { |
527 | htmlf("<span class='age-weeks'>%.0f weeks</span>", | 541 | htmlf("<span class='age-weeks'>%.0f weeks</span>", |
528 | secs * 1.0 / TM_WEEK); | 542 | secs * 1.0 / TM_WEEK); |
529 | return; | 543 | return; |
530 | } | 544 | } |
531 | if (secs < TM_YEAR * 2) { | 545 | if (secs < TM_YEAR * 2) { |
532 | htmlf("<span class='age-months'>%.0f months</span>", | 546 | htmlf("<span class='age-months'>%.0f months</span>", |
533 | secs * 1.0 / TM_MONTH); | 547 | secs * 1.0 / TM_MONTH); |
534 | return; | 548 | return; |
535 | } | 549 | } |
536 | htmlf("<span class='age-years'>%.0f years</span>", | 550 | htmlf("<span class='age-years'>%.0f years</span>", |
537 | secs * 1.0 / TM_YEAR); | 551 | secs * 1.0 / TM_YEAR); |
538 | } | 552 | } |
539 | 553 | ||
540 | void cgit_print_http_headers(struct cgit_context *ctx) | 554 | void cgit_print_http_headers(struct cgit_context *ctx) |
541 | { | 555 | { |
542 | if (ctx->env.no_http && !strcmp(ctx->env.no_http, "1")) | 556 | if (ctx->env.no_http && !strcmp(ctx->env.no_http, "1")) |
543 | return; | 557 | return; |
544 | 558 | ||
545 | if (ctx->page.status) | 559 | if (ctx->page.status) |
546 | htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg); | 560 | htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg); |
547 | if (ctx->page.mimetype && ctx->page.charset) | 561 | if (ctx->page.mimetype && ctx->page.charset) |
548 | htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, | 562 | htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, |
549 | ctx->page.charset); | 563 | ctx->page.charset); |
550 | else if (ctx->page.mimetype) | 564 | else if (ctx->page.mimetype) |
551 | htmlf("Content-Type: %s\n", ctx->page.mimetype); | 565 | htmlf("Content-Type: %s\n", ctx->page.mimetype); |
552 | if (ctx->page.size) | 566 | if (ctx->page.size) |
553 | htmlf("Content-Length: %ld\n", ctx->page.size); | 567 | htmlf("Content-Length: %ld\n", ctx->page.size); |
554 | if (ctx->page.filename) | 568 | if (ctx->page.filename) |
555 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", | 569 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", |
556 | ctx->page.filename); | 570 | ctx->page.filename); |
557 | htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); | 571 | htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); |
558 | htmlf("Expires: %s\n", http_date(ctx->page.expires)); | 572 | htmlf("Expires: %s\n", http_date(ctx->page.expires)); |
559 | if (ctx->page.etag) | 573 | if (ctx->page.etag) |
560 | htmlf("ETag: \"%s\"\n", ctx->page.etag); | 574 | htmlf("ETag: \"%s\"\n", ctx->page.etag); |
561 | html("\n"); | 575 | html("\n"); |
562 | if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) | 576 | if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) |
563 | exit(0); | 577 | exit(0); |
564 | } | 578 | } |
565 | 579 | ||
566 | void cgit_print_docstart(struct cgit_context *ctx) | 580 | void cgit_print_docstart(struct cgit_context *ctx) |
567 | { | 581 | { |
568 | if (ctx->cfg.embedded) { | 582 | if (ctx->cfg.embedded) { |
569 | if (ctx->cfg.header) | 583 | if (ctx->cfg.header) |
570 | html_include(ctx->cfg.header); | 584 | html_include(ctx->cfg.header); |
571 | return; | 585 | return; |
572 | } | 586 | } |
573 | 587 | ||
574 | char *host = cgit_hosturl(); | 588 | char *host = cgit_hosturl(); |
575 | html(cgit_doctype); | 589 | html(cgit_doctype); |
576 | html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); | 590 | html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); |