diff options
Diffstat (limited to 'ui-shared.c')
| -rw-r--r-- | ui-shared.c | 231 |
1 files changed, 165 insertions, 66 deletions
diff --git a/ui-shared.c b/ui-shared.c index 8827fff..c398d7a 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="); |
| @@ -338,27 +341,35 @@ void cgit_commit_link(char *name, char *title, char *class, char *head, | |||
| 338 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { | 341 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { |
| 339 | html(delim); | 342 | html(delim); |
| 340 | 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 = "&"; | ||
| 341 | } | 351 | } |
| 342 | html("'>"); | 352 | html("'>"); |
| 343 | html_txt(name); | 353 | html_txt(name); |
| 344 | html("</a>"); | 354 | html("</a>"); |
| 345 | } | 355 | } |
| 346 | 356 | ||
| 347 | void cgit_refs_link(char *name, char *title, char *class, char *head, | 357 | void cgit_refs_link(const char *name, const char *title, const char *class, |
| 348 | char *rev, char *path) | 358 | const char *head, const char *rev, const char *path) |
| 349 | { | 359 | { |
| 350 | reporevlink("refs", name, title, class, head, rev, path); | 360 | reporevlink("refs", name, title, class, head, rev, path); |
| 351 | } | 361 | } |
| 352 | 362 | ||
| 353 | void cgit_snapshot_link(char *name, char *title, char *class, char *head, | 363 | void cgit_snapshot_link(const char *name, const char *title, const char *class, |
| 354 | char *rev, char *archivename) | 364 | const char *head, const char *rev, |
| 365 | const char *archivename) | ||
| 355 | { | 366 | { |
| 356 | reporevlink("snapshot", name, title, class, head, rev, archivename); | 367 | reporevlink("snapshot", name, title, class, head, rev, archivename); |
| 357 | } | 368 | } |
| 358 | 369 | ||
| 359 | void cgit_diff_link(char *name, char *title, char *class, char *head, | 370 | void cgit_diff_link(const char *name, const char *title, const char *class, |
| 360 | char *new_rev, char *old_rev, char *path, | 371 | const char *head, const char *new_rev, const char *old_rev, |
| 361 | int toggle_ssdiff) | 372 | const char *path, int toggle_ssdiff) |
| 362 | { | 373 | { |
| 363 | char *delim; | 374 | char *delim; |
| 364 | 375 | ||
| @@ -378,24 +389,89 @@ void cgit_diff_link(char *name, char *title, char *class, char *head, | |||
| 378 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { | 389 | if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { |
| 379 | html(delim); | 390 | html(delim); |
| 380 | 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 = "&"; | ||
| 381 | } | 399 | } |
| 382 | html("'>"); | 400 | html("'>"); |
| 383 | html_txt(name); | 401 | html_txt(name); |
| 384 | html("</a>"); | 402 | html("</a>"); |
| 385 | } | 403 | } |
| 386 | 404 | ||
| 387 | void cgit_patch_link(char *name, char *title, char *class, char *head, | 405 | void cgit_patch_link(const char *name, const char *title, const char *class, |
| 388 | char *rev) | 406 | const char *head, const char *rev, const char *path) |
| 389 | { | 407 | { |
| 390 | reporevlink("patch", name, title, class, head, rev, NULL); | 408 | reporevlink("patch", name, title, class, head, rev, path); |
| 391 | } | 409 | } |
| 392 | 410 | ||
| 393 | void cgit_stats_link(char *name, char *title, char *class, char *head, | 411 | void cgit_stats_link(const char *name, const char *title, const char *class, |
| 394 | char *path) | 412 | const char *head, const char *path) |
| 395 | { | 413 | { |
| 396 | reporevlink("stats", name, title, class, head, NULL, path); | 414 | reporevlink("stats", name, title, class, head, NULL, path); |
| 397 | } | 415 | } |
| 398 | 416 | ||
| 417 | void cgit_self_link(char *name, const char *title, const char *class, | ||
| 418 | struct cgit_context *ctx) | ||
| 419 | { | ||
| 420 | if (!strcmp(ctx->qry.page, "repolist")) | ||
| 421 | return cgit_index_link(name, title, class, ctx->qry.search, | ||
| 422 | ctx->qry.ofs); | ||
| 423 | else if (!strcmp(ctx->qry.page, "summary")) | ||
| 424 | return cgit_summary_link(name, title, class, ctx->qry.head); | ||
| 425 | else if (!strcmp(ctx->qry.page, "tag")) | ||
| 426 | return cgit_tag_link(name, title, class, ctx->qry.head, | ||
| 427 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL); | ||
| 428 | else if (!strcmp(ctx->qry.page, "tree")) | ||
| 429 | return cgit_tree_link(name, title, class, ctx->qry.head, | ||
| 430 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
| 431 | ctx->qry.path); | ||
| 432 | else if (!strcmp(ctx->qry.page, "plain")) | ||
| 433 | return cgit_plain_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, "log")) | ||
| 437 | return cgit_log_link(name, title, class, ctx->qry.head, | ||
| 438 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
| 439 | ctx->qry.path, ctx->qry.ofs, | ||
| 440 | ctx->qry.grep, ctx->qry.search, | ||
| 441 | ctx->qry.showmsg); | ||
| 442 | else if (!strcmp(ctx->qry.page, "commit")) | ||
| 443 | return cgit_commit_link(name, title, class, ctx->qry.head, | ||
| 444 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
| 445 | ctx->qry.path, 0); | ||
| 446 | else if (!strcmp(ctx->qry.page, "patch")) | ||
| 447 | return cgit_patch_link(name, title, class, ctx->qry.head, | ||
| 448 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
| 449 | ctx->qry.path); | ||
| 450 | else if (!strcmp(ctx->qry.page, "refs")) | ||
| 451 | return cgit_refs_link(name, title, class, ctx->qry.head, | ||
| 452 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
| 453 | ctx->qry.path); | ||
| 454 | else if (!strcmp(ctx->qry.page, "snapshot")) | ||
| 455 | return cgit_snapshot_link(name, title, class, ctx->qry.head, | ||
| 456 | ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL, | ||
| 457 | ctx->qry.path); | ||
| 458 | else if (!strcmp(ctx->qry.page, "diff")) | ||
| 459 | return cgit_diff_link(name, title, class, ctx->qry.head, | ||
| 460 | ctx->qry.sha1, ctx->qry.sha2, | ||
| 461 | ctx->qry.path, 0); | ||
| 462 | else if (!strcmp(ctx->qry.page, "stats")) | ||
| 463 | return cgit_stats_link(name, title, class, ctx->qry.head, | ||
| 464 | ctx->qry.path); | ||
| 465 | |||
| 466 | /* Don't known how to make link for this page */ | ||
| 467 | repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path); | ||
| 468 | html("><!-- cgit_self_link() doesn't know how to make link for page '"); | ||
| 469 | html_txt(ctx->qry.page); | ||
| 470 | html("' -->"); | ||
| 471 | html_txt(name); | ||
| 472 | html("</a>"); | ||
| 473 | } | ||
| 474 | |||
| 399 | void cgit_object_link(struct object *obj) | 475 | void cgit_object_link(struct object *obj) |
| 400 | { | 476 | { |
| 401 | char *page, *shortrev, *fullrev, *name; | 477 | char *page, *shortrev, *fullrev, *name; |
| @@ -405,7 +481,7 @@ void cgit_object_link(struct object *obj) | |||
| 405 | shortrev[10] = '\0'; | 481 | shortrev[10] = '\0'; |
| 406 | if (obj->type == OBJ_COMMIT) { | 482 | if (obj->type == OBJ_COMMIT) { |
| 407 | cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, | 483 | cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, |
| 408 | ctx.qry.head, fullrev, 0); | 484 | ctx.qry.head, fullrev, NULL, 0); |
| 409 | return; | 485 | return; |
| 410 | } else if (obj->type == OBJ_TREE) | 486 | } else if (obj->type == OBJ_TREE) |
| 411 | page = "tree"; | 487 | page = "tree"; |
| @@ -417,7 +493,7 @@ void cgit_object_link(struct object *obj) | |||
| 417 | reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); | 493 | reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); |
| 418 | } | 494 | } |
| 419 | 495 | ||
| 420 | void cgit_print_date(time_t secs, char *format, int local_time) | 496 | void cgit_print_date(time_t secs, const char *format, int local_time) |
| 421 | { | 497 | { |
| 422 | char buf[64]; | 498 | char buf[64]; |
| 423 | struct tm *time; | 499 | struct tm *time; |
| @@ -432,7 +508,7 @@ void cgit_print_date(time_t secs, char *format, int local_time) | |||
| 432 | html_txt(buf); | 508 | html_txt(buf); |
| 433 | } | 509 | } |
| 434 | 510 | ||
| 435 | void cgit_print_age(time_t t, time_t max_relative, char *format) | 511 | void cgit_print_age(time_t t, time_t max_relative, const char *format) |
| 436 | { | 512 | { |
| 437 | time_t now, secs; | 513 | time_t now, secs; |
| 438 | 514 | ||
| @@ -531,7 +607,7 @@ void cgit_print_docstart(struct cgit_context *ctx) | |||
| 531 | html("<link rel='alternate' title='Atom feed' href='"); | 607 | html("<link rel='alternate' title='Atom feed' href='"); |
| 532 | html(cgit_httpscheme()); | 608 | html(cgit_httpscheme()); |
| 533 | html_attr(cgit_hosturl()); | 609 | html_attr(cgit_hosturl()); |
| 534 | html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.path, | 610 | html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.vpath, |
| 535 | fmt("h=%s", ctx->qry.head))); | 611 | fmt("h=%s", ctx->qry.head))); |
| 536 | html("' type='application/atom+xml'/>\n"); | 612 | html("' type='application/atom+xml'/>\n"); |
| 537 | } | 613 | } |
| @@ -611,14 +687,15 @@ int print_archive_ref(const char *refname, const unsigned char *sha1, | |||
| 611 | return 0; | 687 | return 0; |
| 612 | } | 688 | } |
| 613 | 689 | ||
| 614 | void cgit_add_hidden_formfields(int incl_head, int incl_search, char *page) | 690 | void cgit_add_hidden_formfields(int incl_head, int incl_search, |
| 691 | const char *page) | ||
| 615 | { | 692 | { |
| 616 | char *url; | 693 | char *url; |
| 617 | 694 | ||
| 618 | if (!ctx.cfg.virtual_root) { | 695 | if (!ctx.cfg.virtual_root) { |
| 619 | url = fmt("%s/%s", ctx.qry.repo, page); | 696 | url = fmt("%s/%s", ctx.qry.repo, page); |
| 620 | if (ctx.qry.path) | 697 | if (ctx.qry.vpath) |
| 621 | url = fmt("%s/%s", url, ctx.qry.path); | 698 | url = fmt("%s/%s", url, ctx.qry.vpath); |
| 622 | html_hidden("url", url); | 699 | html_hidden("url", url); |
| 623 | } | 700 | } |
| 624 | 701 | ||
| @@ -641,11 +718,30 @@ void cgit_add_hidden_formfields(int incl_head, int incl_search, char *page) | |||
| 641 | } | 718 | } |
| 642 | } | 719 | } |
| 643 | 720 | ||
| 644 | const char *fallback_cmd = "repolist"; | 721 | static const char *hc(struct cgit_context *ctx, const char *page) |
| 722 | { | ||
| 723 | return strcmp(ctx->qry.page, page) ? NULL : "active"; | ||
| 724 | } | ||
| 645 | 725 | ||
| 646 | char *hc(struct cgit_cmd *cmd, const char *page) | 726 | static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path) |
| 647 | { | 727 | { |
| 648 | return (strcmp(cmd ? cmd->name : fallback_cmd, page) ? NULL : "active"); | 728 | char *old_path = ctx->qry.path; |
| 729 | char *p = path, *q, *end = path + strlen(path); | ||
| 730 | |||
| 731 | ctx->qry.path = NULL; | ||
| 732 | cgit_self_link("root", NULL, NULL, ctx); | ||
| 733 | ctx->qry.path = p = path; | ||
| 734 | while (p < end) { | ||
| 735 | if (!(q = strchr(p, '/'))) | ||
| 736 | q = end; | ||
| 737 | *q = '\0'; | ||
| 738 | html_txt("/"); | ||
| 739 | cgit_self_link(p, NULL, NULL, ctx); | ||
| 740 | if (q < end) | ||
| 741 | *q = '/'; | ||
| 742 | p = q + 1; | ||
| 743 | } | ||
| 744 | ctx->qry.path = old_path; | ||
| 649 | } | 745 | } |
| 650 | 746 | ||
| 651 | static void print_header(struct cgit_context *ctx) | 747 | static void print_header(struct cgit_context *ctx) |
| @@ -697,47 +793,44 @@ static void print_header(struct cgit_context *ctx) | |||
| 697 | 793 | ||
| 698 | void cgit_print_pageheader(struct cgit_context *ctx) | 794 | void cgit_print_pageheader(struct cgit_context *ctx) |
| 699 | { | 795 | { |
| 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'>"); | 796 | html("<div id='cgit'>"); |
| 706 | if (!ctx->cfg.noheader) | 797 | if (!ctx->cfg.noheader) |
| 707 | print_header(ctx); | 798 | print_header(ctx); |
| 708 | 799 | ||
| 709 | html("<table class='tabs'><tr><td>\n"); | 800 | html("<table class='tabs'><tr><td>\n"); |
| 710 | if (ctx->repo) { | 801 | if (ctx->repo) { |
| 711 | cgit_summary_link("summary", NULL, hc(cmd, "summary"), | 802 | cgit_summary_link("summary", NULL, hc(ctx, "summary"), |
| 712 | ctx->qry.head); | 803 | ctx->qry.head); |
| 713 | cgit_refs_link("refs", NULL, hc(cmd, "refs"), ctx->qry.head, | 804 | cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, |
| 714 | ctx->qry.sha1, NULL); | 805 | ctx->qry.sha1, NULL); |
| 715 | cgit_log_link("log", NULL, hc(cmd, "log"), ctx->qry.head, | 806 | cgit_log_link("log", NULL, hc(ctx, "log"), ctx->qry.head, |
| 716 | NULL, NULL, 0, NULL, NULL, ctx->qry.showmsg); | 807 | NULL, ctx->qry.vpath, 0, NULL, NULL, |
| 717 | cgit_tree_link("tree", NULL, hc(cmd, "tree"), ctx->qry.head, | 808 | ctx->qry.showmsg); |
| 718 | ctx->qry.sha1, NULL); | 809 | cgit_tree_link("tree", NULL, hc(ctx, "tree"), ctx->qry.head, |
| 719 | cgit_commit_link("commit", NULL, hc(cmd, "commit"), | 810 | ctx->qry.sha1, ctx->qry.vpath); |
| 720 | ctx->qry.head, ctx->qry.sha1, 0); | 811 | cgit_commit_link("commit", NULL, hc(ctx, "commit"), |
| 721 | cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, | 812 | ctx->qry.head, ctx->qry.sha1, ctx->qry.vpath, 0); |
| 722 | ctx->qry.sha1, ctx->qry.sha2, NULL, 0); | 813 | cgit_diff_link("diff", NULL, hc(ctx, "diff"), ctx->qry.head, |
| 814 | ctx->qry.sha1, ctx->qry.sha2, ctx->qry.vpath, 0); | ||
| 723 | if (ctx->repo->max_stats) | 815 | if (ctx->repo->max_stats) |
| 724 | cgit_stats_link("stats", NULL, hc(cmd, "stats"), | 816 | cgit_stats_link("stats", NULL, hc(ctx, "stats"), |
| 725 | ctx->qry.head, NULL); | 817 | ctx->qry.head, ctx->qry.vpath); |
| 726 | if (ctx->repo->readme) | 818 | if (ctx->repo->readme) |
| 727 | reporevlink("about", "about", NULL, | 819 | reporevlink("about", "about", NULL, |
| 728 | hc(cmd, "about"), ctx->qry.head, NULL, | 820 | hc(ctx, "about"), ctx->qry.head, NULL, |
| 729 | NULL); | 821 | NULL); |
| 730 | html("</td><td class='form'>"); | 822 | html("</td><td class='form'>"); |
| 731 | html("<form class='right' method='get' action='"); | 823 | html("<form class='right' method='get' action='"); |
| 732 | if (ctx->cfg.virtual_root) | 824 | if (ctx->cfg.virtual_root) |
| 733 | html_url_path(cgit_fileurl(ctx->qry.repo, "log", | 825 | html_url_path(cgit_fileurl(ctx->qry.repo, "log", |
| 734 | ctx->qry.path, NULL)); | 826 | ctx->qry.vpath, NULL)); |
| 735 | html("'>\n"); | 827 | html("'>\n"); |
| 736 | cgit_add_hidden_formfields(1, 0, "log"); | 828 | cgit_add_hidden_formfields(1, 0, "log"); |
| 737 | html("<select name='qt'>\n"); | 829 | html("<select name='qt'>\n"); |
| 738 | html_option("grep", "log msg", ctx->qry.grep); | 830 | html_option("grep", "log msg", ctx->qry.grep); |
| 739 | html_option("author", "author", ctx->qry.grep); | 831 | html_option("author", "author", ctx->qry.grep); |
| 740 | html_option("committer", "committer", ctx->qry.grep); | 832 | html_option("committer", "committer", ctx->qry.grep); |
| 833 | html_option("range", "range", ctx->qry.grep); | ||
| 741 | html("</select>\n"); | 834 | html("</select>\n"); |
| 742 | html("<input class='txt' type='text' size='10' name='q' value='"); | 835 | html("<input class='txt' type='text' size='10' name='q' value='"); |
| 743 | html_attr(ctx->qry.search); | 836 | html_attr(ctx->qry.search); |
| @@ -745,9 +838,9 @@ void cgit_print_pageheader(struct cgit_context *ctx) | |||
| 745 | html("<input type='submit' value='search'/>\n"); | 838 | html("<input type='submit' value='search'/>\n"); |
| 746 | html("</form>\n"); | 839 | html("</form>\n"); |
| 747 | } else { | 840 | } else { |
| 748 | site_link(NULL, "index", NULL, hc(cmd, "repolist"), NULL, 0); | 841 | site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0); |
| 749 | if (ctx->cfg.root_readme) | 842 | if (ctx->cfg.root_readme) |
| 750 | site_link("about", "about", NULL, hc(cmd, "about"), | 843 | site_link("about", "about", NULL, hc(ctx, "about"), |
| 751 | NULL, 0); | 844 | NULL, 0); |
| 752 | html("</td><td class='form'>"); | 845 | html("</td><td class='form'>"); |
| 753 | html("<form method='get' action='"); | 846 | html("<form method='get' action='"); |
| @@ -760,6 +853,12 @@ void cgit_print_pageheader(struct cgit_context *ctx) | |||
| 760 | html("</form>"); | 853 | html("</form>"); |
| 761 | } | 854 | } |
| 762 | html("</td></tr></table>\n"); | 855 | html("</td></tr></table>\n"); |
| 856 | if (ctx->qry.vpath) { | ||
| 857 | html("<div class='path'>"); | ||
| 858 | html("path: "); | ||
| 859 | cgit_print_path_crumbs(ctx, ctx->qry.vpath); | ||
| 860 | html("</div>"); | ||
| 861 | } | ||
| 763 | html("<div class='content'>"); | 862 | html("<div class='content'>"); |
| 764 | } | 863 | } |
| 765 | 864 | ||
