diff options
Diffstat (limited to 'ui-shared.c')
-rw-r--r-- | ui-shared.c | 216 |
1 files changed, 150 insertions, 66 deletions
diff --git a/ui-shared.c b/ui-shared.c index 8827fff..e991799 100644 --- a/ui-shared.c +++ b/ui-shared.c | |||
@@ -27,7 +27,7 @@ static char *http_date(time_t t) | |||
27 | tm->tm_hour, tm->tm_min, tm->tm_sec); | 27 | tm->tm_hour, tm->tm_min, tm->tm_sec); |
28 | } | 28 | } |
29 | 29 | ||
30 | void cgit_print_error(char *msg) | 30 | void cgit_print_error(const char *msg) |
31 | { | 31 | { |
32 | html("<div class='error'>"); | 32 | html("<div class='error'>"); |
33 | html_txt(msg); | 33 | html_txt(msg); |
@@ -133,7 +133,7 @@ char *cgit_currurl() | |||
133 | return fmt("%s/", ctx.cfg.virtual_root); | 133 | return fmt("%s/", ctx.cfg.virtual_root); |
134 | } | 134 | } |
135 | 135 | ||
136 | static void site_url(char *page, char *search, int ofs) | 136 | static void site_url(const char *page, const char *search, int ofs) |
137 | { | 137 | { |
138 | char *delim = "?"; | 138 | char *delim = "?"; |
139 | 139 | ||
@@ -160,8 +160,8 @@ static void site_url(char *page, char *search, int ofs) | |||
160 | } | 160 | } |
161 | } | 161 | } |
162 | 162 | ||
163 | static void site_link(char *page, char *name, char *title, char *class, | 163 | static void site_link(const char *page, const char *name, const char *title, |
164 | 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) { |
@@ -181,14 +181,14 @@ static void site_link(char *page, char *name, char *title, char *class, | |||
181 | html("</a>"); | 181 | html("</a>"); |
182 | } | 182 | } |
183 | 183 | ||
184 | void cgit_index_link(char *name, char *title, char *class, char *pattern, | 184 | void cgit_index_link(const char *name, const char *title, const char *class, |
185 | 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(char *title, char *class, char *page, char *head, | 190 | static char *repolink(const char *title, const char *class, const char *page, |
191 | char *path) | 191 | const char *head, const char *path) |
192 | { | 192 | { |
193 | char *delim = "?"; | 193 | char *delim = "?"; |
194 | 194 | ||
@@ -240,8 +240,9 @@ static char *repolink(char *title, char *class, char *page, char *head, | |||
240 | return fmt("%s", delim); | 240 | return fmt("%s", delim); |
241 | } | 241 | } |
242 | 242 | ||
243 | static void reporevlink(char *page, char *name, char *title, char *class, | 243 | static void reporevlink(const char *page, const char *name, const char *title, |
244 | char *head, char *rev, char *path) | 244 | const char *class, const char *head, const char *rev, |
245 | const char *path) | ||
245 | { | 246 | { |
246 | char *delim; | 247 | char *delim; |
247 | 248 | ||
@@ -256,32 +257,33 @@ static void reporevlink(char *page, char *name, char *title, char *class, | |||
256 | html("</a>"); | 257 | html("</a>"); |
257 | } | 258 | } |
258 | 259 | ||
259 | void cgit_summary_link(char *name, char *title, char *class, char *head) | 260 | void cgit_summary_link(const char *name, const char *title, const char *class, |
261 | const char *head) | ||
260 | { | 262 | { |
261 | reporevlink(NULL, name, title, class, head, NULL, NULL); | 263 | reporevlink(NULL, name, title, class, head, NULL, NULL); |
262 | } | 264 | } |
263 | 265 | ||
264 | void cgit_tag_link(char *name, char *title, char *class, char *head, | 266 | void cgit_tag_link(const char *name, const char *title, const char *class, |
265 | char *rev) | 267 | const char *head, const char *rev) |
266 | { | 268 | { |
267 | reporevlink("tag", name, title, class, head, rev, NULL); | 269 | reporevlink("tag", name, title, class, head, rev, NULL); |
268 | } | 270 | } |
269 | 271 | ||
270 | void cgit_tree_link(char *name, char *title, char *class, char *head, | 272 | void cgit_tree_link(const char *name, const char *title, const char *class, |
271 | char *rev, char *path) | 273 | const char *head, const char *rev, const char *path) |
272 | { | 274 | { |
273 | reporevlink("tree", name, title, class, head, rev, path); | 275 | reporevlink("tree", name, title, class, head, rev, path); |
274 | } | 276 | } |
275 | 277 | ||
276 | void cgit_plain_link(char *name, char *title, char *class, char *head, | 278 | void cgit_plain_link(const char *name, const char *title, const char *class, |
277 | char *rev, char *path) | 279 | const char *head, const char *rev, const char *path) |
278 | { | 280 | { |
279 | reporevlink("plain", name, title, class, head, rev, path); | 281 | reporevlink("plain", name, title, class, head, rev, path); |
280 | } | 282 | } |
281 | 283 | ||
282 | void cgit_log_link(char *name, char *title, char *class, char *head, | 284 | void cgit_log_link(const char *name, const char *title, const char *class, |
283 | char *rev, char *path, int ofs, char *grep, char *pattern, | 285 | const char *head, const char *rev, const char *path, |
284 | int showmsg) | 286 | int ofs, const char *grep, const char *pattern, int showmsg) |
285 | { | 287 | { |
286 | char *delim; | 288 | char *delim; |
287 | 289 | ||
@@ -316,8 +318,9 @@ void cgit_log_link(char *name, char *title, char *class, char *head, | |||
316 | html("</a>"); | 318 | html("</a>"); |
317 | } | 319 | } |
318 | 320 | ||
319 | void cgit_commit_link(char *name, char *title, char *class, char *head, | 321 | void cgit_commit_link(char *name, const char *title, const char *class, |
320 | char *rev, int toggle_ssdiff) | 322 | const char *head, const char *rev, const char *path, |
323 | int toggle_ssdiff) | ||
321 | { | 324 | { |
322 | 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) { |
323 | name[ctx.cfg.max_msg_len] = '\0'; | 326 | name[ctx.cfg.max_msg_len] = '\0'; |
@@ -328,7 +331,7 @@ void cgit_commit_link(char *name, char *title, char *class, char *head, | |||
328 | 331 | ||
329 | char *delim; | 332 | char *delim; |
330 | 333 | ||
331 | delim = repolink(title, class, "commit", head, NULL); | 334 | delim = repolink(title, class, "commit", head, path); |
332 | if (rev && strcmp(rev, ctx.qry.head)) { | 335 | if (rev && strcmp(rev, ctx.qry.head)) { |
333 | html(delim); | 336 | html(delim); |
334 | html("id="); | 337 | html("id="); |
@@ -344,21 +347,22 @@ void cgit_commit_link(char *name, char *title, char *class, char *head, | |||
344 | html("</a>"); | 347 | html("</a>"); |
345 | } | 348 | } |
346 | 349 | ||
347 | void cgit_refs_link(char *name, char *title, char *class, char *head, | 350 | void cgit_refs_link(const char *name, const char *title, const char *class, |
348 | char *rev, char *path) | 351 | const char *head, const char *rev, const char *path) |
349 | { | 352 | { |
350 | reporevlink("refs", name, title, class, head, rev, path); | 353 | reporevlink("refs", name, title, class, head, rev, path); |
351 | } | 354 | } |
352 | 355 | ||
353 | void cgit_snapshot_link(char *name, char *title, char *class, char *head, | 356 | void cgit_snapshot_link(const char *name, const char *title, const char *class, |
354 | char *rev, char *archivename) | 357 | const char *head, const char *rev, |
358 | const char *archivename) | ||
355 | { | 359 | { |
356 | reporevlink("snapshot", name, title, class, head, rev, archivename); | 360 | reporevlink("snapshot", name, title, class, head, rev, archivename); |
357 | } | 361 | } |
358 | 362 | ||
359 | void cgit_diff_link(char *name, char *title, char *class, char *head, | 363 | void cgit_diff_link(const char *name, const char *title, const char *class, |
360 | char *new_rev, char *old_rev, char *path, | 364 | const char *head, const char *new_rev, const char *old_rev, |
361 | int toggle_ssdiff) | 365 | const char *path, int toggle_ssdiff) |
362 | { | 366 | { |
363 | char *delim; | 367 | char *delim; |
364 | 368 | ||
@@ -384,18 +388,76 @@ void cgit_diff_link(char *name, char *title, char *class, char *head, | |||
384 | html("</a>"); | 388 | html("</a>"); |
385 | } | 389 | } |
386 | 390 | ||
387 | void cgit_patch_link(char *name, char *title, char *class, char *head, | 391 | void cgit_patch_link(const char *name, const char *title, const char *class, |
388 | char *rev) | 392 | const char *head, const char *rev, const char *path) |
389 | { | 393 | { |
390 | reporevlink("patch", name, title, class, head, rev, NULL); | 394 | reporevlink("patch", name, title, class, head, rev, path); |
391 | } | 395 | } |
392 | 396 | ||
393 | void cgit_stats_link(char *name, char *title, char *class, char *head, | 397 | void cgit_stats_link(const char *name, const char *title, const char *class, |
394 | char *path) | 398 | const char *head, const char *path) |
395 | { | 399 | { |
396 | reporevlink("stats", name, title, class, head, NULL, path); | 400 | reporevlink("stats", name, title, class, head, NULL, path); |
397 | } | 401 | } |
398 | 402 | ||
403 | void cgit_self_link(char *name, const char *title, const char *class, | ||
404 | struct cgit_context *ctx) | ||
405 | { | ||
406 | if (!strcmp(ctx->qry.page, "repolist")) | ||
407 | return cgit_index_link(name, title, class, ctx->qry.search, | ||
408 | ctx->qry.ofs); | ||
409 | else if (!strcmp(ctx->qry.page, "summary")) | ||
410 | return cgit_summary_link(name, title, class, ctx->qry.head); | ||
411 | else if (!strcmp(ctx->qry.page, "tag")) | ||
412 | return cgit_tag_link(name, title, class, ctx->qry.head, | ||
413 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL); | ||
414 | else if (!strcmp(ctx->qry.page, "tree")) | ||
415 | return cgit_tree_link(name, title, class, ctx->qry.head, | ||
416 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
417 | ctx->qry.path); | ||
418 | else if (!strcmp(ctx->qry.page, "plain")) | ||
419 | return cgit_plain_link(name, title, class, ctx->qry.head, | ||
420 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
421 | ctx->qry.path); | ||
422 | else if (!strcmp(ctx->qry.page, "log")) | ||
423 | return cgit_log_link(name, title, class, ctx->qry.head, | ||
424 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
425 | ctx->qry.path, ctx->qry.ofs, | ||
426 | ctx->qry.grep, ctx->qry.search, | ||
427 | ctx->qry.showmsg); | ||
428 | else if (!strcmp(ctx->qry.page, "commit")) | ||
429 | return cgit_commit_link(name, title, class, ctx->qry.head, | ||
430 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
431 | ctx->qry.path, 0); | ||
432 | else if (!strcmp(ctx->qry.page, "patch")) | ||
433 | return cgit_patch_link(name, title, class, ctx->qry.head, | ||
434 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
435 | ctx->qry.path); | ||
436 | else if (!strcmp(ctx->qry.page, "refs")) | ||
437 | return cgit_refs_link(name, title, class, ctx->qry.head, | ||
438 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
439 | ctx->qry.path); | ||
440 | else if (!strcmp(ctx->qry.page, "snapshot")) | ||
441 | return cgit_snapshot_link(name, title, class, ctx->qry.head, | ||
442 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
443 | ctx->qry.path); | ||
444 | else if (!strcmp(ctx->qry.page, "diff")) | ||
445 | return cgit_diff_link(name, title, class, ctx->qry.head, | ||
446 | ctx->qry.sha1, ctx->qry.sha2, | ||
447 | ctx->qry.path, 0); | ||
448 | else if (!strcmp(ctx->qry.page, "stats")) | ||
449 | return cgit_stats_link(name, title, class, ctx->qry.head, | ||
450 | ctx->qry.path); | ||
451 | |||
452 | /* Don't known how to make link for this page */ | ||
453 | 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 '"); | ||
455 | html_txt(ctx->qry.page); | ||
456 | html("' -->"); | ||
457 | html_txt(name); | ||
458 | html("</a>"); | ||
459 | } | ||
460 | |||
399 | void cgit_object_link(struct object *obj) | 461 | void cgit_object_link(struct object *obj) |
400 | { | 462 | { |
401 | char *page, *shortrev, *fullrev, *name; | 463 | char *page, *shortrev, *fullrev, *name; |
@@ -405,7 +467,7 @@ void cgit_object_link(struct object *obj) | |||
405 | shortrev[10] = '\0'; | 467 | shortrev[10] = '\0'; |
406 | if (obj->type == OBJ_COMMIT) { | 468 | if (obj->type == OBJ_COMMIT) { |
407 | cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, | 469 | cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, |
408 | ctx.qry.head, fullrev, 0); | 470 | ctx.qry.head, fullrev, NULL, 0); |
409 | return; | 471 | return; |
410 | } else if (obj->type == OBJ_TREE) | 472 | } else if (obj->type == OBJ_TREE) |
411 | page = "tree"; | 473 | page = "tree"; |
@@ -417,7 +479,7 @@ void cgit_object_link(struct object *obj) | |||
417 | reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); | 479 | reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); |
418 | } | 480 | } |
419 | 481 | ||
420 | void cgit_print_date(time_t secs, char *format, int local_time) | 482 | void cgit_print_date(time_t secs, const char *format, int local_time) |
421 | { | 483 | { |
422 | char buf[64]; | 484 | char buf[64]; |
423 | struct tm *time; | 485 | struct tm *time; |
@@ -432,7 +494,7 @@ void cgit_print_date(time_t secs, char *format, int local_time) | |||
432 | html_txt(buf); | 494 | html_txt(buf); |
433 | } | 495 | } |
434 | 496 | ||
435 | void cgit_print_age(time_t t, time_t max_relative, char *format) | 497 | void cgit_print_age(time_t t, time_t max_relative, const char *format) |
436 | { | 498 | { |
437 | time_t now, secs; | 499 | time_t now, secs; |
438 | 500 | ||
@@ -531,7 +593,7 @@ void cgit_print_docstart(struct cgit_context *ctx) | |||
531 | html("<link rel='alternate' title='Atom feed' href='"); | 593 | html("<link rel='alternate' title='Atom feed' href='"); |
532 | html(cgit_httpscheme()); | 594 | html(cgit_httpscheme()); |
533 | html_attr(cgit_hosturl()); | 595 | html_attr(cgit_hosturl()); |
534 | html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path, | 596 | html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.vpath, |
535 | fmt("h=%s", ctx->qry.head))); | 597 | fmt("h=%s", ctx->qry.head))); |
536 | html("' type='application/atom+xml'/>\n"); | 598 | html("' type='application/atom+xml'/>\n"); |
537 | } | 599 | } |
@@ -611,14 +673,15 @@ int print_archive_ref(const char *refname, const unsigned char *sha1, | |||
611 | return 0; | 673 | return 0; |
612 | } | 674 | } |
613 | 675 | ||
614 | void cgit_add_hidden_formfields(int incl_head, int incl_search, char *page) | 676 | void cgit_add_hidden_formfields(int incl_head, int incl_search, |
677 | const char *page) | ||
615 | { | 678 | { |
616 | char *url; | 679 | char *url; |
617 | 680 | ||
618 | if (!ctx.cfg.virtual_root) { | 681 | if (!ctx.cfg.virtual_root) { |
619 | url = fmt("%s/%s", ctx.qry.repo, page); | 682 | url = fmt("%s/%s", ctx.qry.repo, page); |
620 | if (ctx.qry.path) | 683 | if (ctx.qry.vpath) |
621 | url = fmt("%s/%s", url, ctx.qry.path); | 684 | url = fmt("%s/%s", url, ctx.qry.vpath); |
622 | html_hidden("url", url); | 685 | html_hidden("url", url); |
623 | } | 686 | } |
624 | 687 | ||
@@ -641,11 +704,30 @@ void cgit_add_hidden_formfields(int incl_head, int incl_search, char *page) | |||
641 | } | 704 | } |
642 | } | 705 | } |
643 | 706 | ||
644 | const char *fallback_cmd = "repolist"; | 707 | static const char *hc(struct cgit_context *ctx, const char *page) |
708 | { | ||
709 | return strcmp(ctx->qry.page, page) ? NULL : "active"; | ||
710 | } | ||
645 | 711 | ||
646 | char *hc(struct cgit_cmd *cmd, const char *page) | 712 | static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path) |
647 | { | 713 | { |
648 | return (strcmp(cmd ? cmd->name : fallback_cmd, page) ? NULL : "active"); | 714 | char *old_path = ctx->qry.path; |
715 | char *p = path, *q, *end = path + strlen(path); | ||
716 | |||
717 | ctx->qry.path = NULL; | ||
718 | cgit_self_link("root", NULL, NULL, ctx); | ||
719 | ctx->qry.path = p = path; | ||
720 | while (p < end) { | ||
721 | if (!(q = strchr(p, '/'))) | ||
722 | q = end; | ||
723 | *q = '\0'; | ||
724 | html_txt("/"); | ||
725 | cgit_self_link(p, NULL, NULL, ctx); | ||
726 | if (q < end) | ||
727 | *q = '/'; | ||
728 | p = q + 1; | ||
729 | } | ||
730 | ctx->qry.path = old_path; | ||
649 | } | 731 | } |
650 | 732 | ||
651 | static void print_header(struct cgit_context *ctx) | 733 | static void print_header(struct cgit_context *ctx) |
@@ -697,41 +779,37 @@ static void print_header(struct cgit_context *ctx) | |||
697 | 779 | ||
698 | void cgit_print_pageheader(struct cgit_context *ctx) | 780 | void cgit_print_pageheader(struct cgit_context *ctx) |
699 | { | 781 | { |
700 | struct cgit_cmd *cmd = cgit_get_cmd(ctx); | ||
701 | |||
702 | if (!cmd && ctx->repo) | ||
703 | fallback_cmd = "summary"; | ||
704 | |||
705 | html("<div id='cgit'>"); | 782 | html("<div id='cgit'>"); |
706 | if (!ctx->cfg.noheader) | 783 | if (!ctx->cfg.noheader) |
707 | print_header(ctx); | 784 | print_header(ctx); |
708 | 785 | ||
709 | html("<table class='tabs'><tr><td>\n"); | 786 | html("<table class='tabs'><tr><td>\n"); |
710 | if (ctx->repo) { | 787 | if (ctx->repo) { |
711 | cgit_summary_link("summary", NULL, hc(cmd, "summary"), | 788 | cgit_summary_link("summary", NULL, hc(ctx, "summary"), |
712 | ctx->qry.head); | 789 | ctx->qry.head); |
713 | cgit_refs_link("refs", NULL, hc(cmd, "refs"), ctx->qry.head, | 790 | cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, |
714 | ctx->qry.sha1, NULL); | ||
715 | cgit_log_link("log", NULL, hc(cmd, "log"), ctx->qry.head, | ||
716 | NULL, NULL, 0, NULL, NULL, ctx->qry.showmsg); | ||
717 | cgit_tree_link("tree", NULL, hc(cmd, "tree"), ctx->qry.head, | ||
718 | ctx->qry.sha1, NULL); | 791 | ctx->qry.sha1, NULL); |
719 | cgit_commit_link("commit", NULL, hc(cmd, "commit"), | 792 | cgit_log_link("log", NULL, hc(ctx, "log"), ctx->qry.head, |
720 | ctx->qry.head, ctx->qry.sha1, 0); | 793 | NULL, ctx->qry.vpath, 0, NULL, NULL, |
721 | cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, | 794 | ctx->qry.showmsg); |
722 | ctx->qry.sha1, ctx->qry.sha2, NULL, 0); | 795 | cgit_tree_link("tree", NULL, hc(ctx, "tree"), ctx->qry.head, |
796 | ctx->qry.sha1, ctx->qry.vpath); | ||
797 | cgit_commit_link("commit", NULL, hc(ctx, "commit"), | ||
798 | ctx->qry.head, ctx->qry.sha1, ctx->qry.vpath, 0); | ||
799 | cgit_diff_link("diff", NULL, hc(ctx, "diff"), ctx->qry.head, | ||
800 | ctx->qry.sha1, ctx->qry.sha2, ctx->qry.vpath, 0); | ||
723 | if (ctx->repo->max_stats) | 801 | if (ctx->repo->max_stats) |
724 | cgit_stats_link("stats", NULL, hc(cmd, "stats"), | 802 | cgit_stats_link("stats", NULL, hc(ctx, "stats"), |
725 | ctx->qry.head, NULL); | 803 | ctx->qry.head, ctx->qry.vpath); |
726 | if (ctx->repo->readme) | 804 | if (ctx->repo->readme) |
727 | reporevlink("about", "about", NULL, | 805 | reporevlink("about", "about", NULL, |
728 | hc(cmd, "about"), ctx->qry.head, NULL, | 806 | hc(ctx, "about"), ctx->qry.head, NULL, |
729 | NULL); | 807 | NULL); |
730 | html("</td><td class='form'>"); | 808 | html("</td><td class='form'>"); |
731 | html("<form class='right' method='get' action='"); | 809 | html("<form class='right' method='get' action='"); |
732 | if (ctx->cfg.virtual_root) | 810 | if (ctx->cfg.virtual_root) |
733 | html_url_path(cgit_fileurl(ctx->qry.repo, "log", | 811 | html_url_path(cgit_fileurl(ctx->qry.repo, "log", |
734 | ctx->qry.path, NULL)); | 812 | ctx->qry.vpath, NULL)); |
735 | html("'>\n"); | 813 | html("'>\n"); |
736 | cgit_add_hidden_formfields(1, 0, "log"); | 814 | cgit_add_hidden_formfields(1, 0, "log"); |
737 | html("<select name='qt'>\n"); | 815 | html("<select name='qt'>\n"); |
@@ -745,9 +823,9 @@ void cgit_print_pageheader(struct cgit_context *ctx) | |||
745 | html("<input type='submit' value='search'/>\n"); | 823 | html("<input type='submit' value='search'/>\n"); |
746 | html("</form>\n"); | 824 | html("</form>\n"); |
747 | } else { | 825 | } else { |
748 | site_link(NULL, "index", NULL, hc(cmd, "repolist"), NULL, 0); | 826 | site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0); |
749 | if (ctx->cfg.root_readme) | 827 | if (ctx->cfg.root_readme) |
750 | site_link("about", "about", NULL, hc(cmd, "about"), | 828 | site_link("about", "about", NULL, hc(ctx, "about"), |
751 | NULL, 0); | 829 | NULL, 0); |
752 | html("</td><td class='form'>"); | 830 | html("</td><td class='form'>"); |
753 | html("<form method='get' action='"); | 831 | html("<form method='get' action='"); |
@@ -760,6 +838,12 @@ void cgit_print_pageheader(struct cgit_context *ctx) | |||
760 | html("</form>"); | 838 | html("</form>"); |
761 | } | 839 | } |
762 | html("</td></tr></table>\n"); | 840 | html("</td></tr></table>\n"); |
841 | if (ctx->qry.vpath) { | ||
842 | html("<div class='path'>"); | ||
843 | html("path: "); | ||
844 | cgit_print_path_crumbs(ctx, ctx->qry.vpath); | ||
845 | html("</div>"); | ||
846 | } | ||
763 | html("<div class='content'>"); | 847 | html("<div class='content'>"); |
764 | } | 848 | } |
765 | 849 | ||