-rw-r--r-- | ui-shared.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/ui-shared.c b/ui-shared.c index ae29615..7efae7a 100644 --- a/ui-shared.c +++ b/ui-shared.c | |||
@@ -567,343 +567,353 @@ void cgit_print_http_headers(struct cgit_context *ctx) | |||
567 | return; | 567 | return; |
568 | 568 | ||
569 | if (ctx->page.status) | 569 | if (ctx->page.status) |
570 | htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg); | 570 | htmlf("Status: %d %s\n", ctx->page.status, ctx->page.statusmsg); |
571 | if (ctx->page.mimetype && ctx->page.charset) | 571 | if (ctx->page.mimetype && ctx->page.charset) |
572 | htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, | 572 | htmlf("Content-Type: %s; charset=%s\n", ctx->page.mimetype, |
573 | ctx->page.charset); | 573 | ctx->page.charset); |
574 | else if (ctx->page.mimetype) | 574 | else if (ctx->page.mimetype) |
575 | htmlf("Content-Type: %s\n", ctx->page.mimetype); | 575 | htmlf("Content-Type: %s\n", ctx->page.mimetype); |
576 | if (ctx->page.size) | 576 | if (ctx->page.size) |
577 | htmlf("Content-Length: %ld\n", ctx->page.size); | 577 | htmlf("Content-Length: %ld\n", ctx->page.size); |
578 | if (ctx->page.filename) | 578 | if (ctx->page.filename) |
579 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", | 579 | htmlf("Content-Disposition: inline; filename=\"%s\"\n", |
580 | ctx->page.filename); | 580 | ctx->page.filename); |
581 | htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); | 581 | htmlf("Last-Modified: %s\n", http_date(ctx->page.modified)); |
582 | htmlf("Expires: %s\n", http_date(ctx->page.expires)); | 582 | htmlf("Expires: %s\n", http_date(ctx->page.expires)); |
583 | if (ctx->page.etag) | 583 | if (ctx->page.etag) |
584 | htmlf("ETag: \"%s\"\n", ctx->page.etag); | 584 | htmlf("ETag: \"%s\"\n", ctx->page.etag); |
585 | html("\n"); | 585 | html("\n"); |
586 | if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) | 586 | if (ctx->env.request_method && !strcmp(ctx->env.request_method, "HEAD")) |
587 | exit(0); | 587 | exit(0); |
588 | } | 588 | } |
589 | 589 | ||
590 | void cgit_print_docstart(struct cgit_context *ctx) | 590 | void cgit_print_docstart(struct cgit_context *ctx) |
591 | { | 591 | { |
592 | if (ctx->cfg.embedded) { | 592 | if (ctx->cfg.embedded) { |
593 | if (ctx->cfg.header) | 593 | if (ctx->cfg.header) |
594 | html_include(ctx->cfg.header); | 594 | html_include(ctx->cfg.header); |
595 | return; | 595 | return; |
596 | } | 596 | } |
597 | 597 | ||
598 | char *host = cgit_hosturl(); | 598 | char *host = cgit_hosturl(); |
599 | html(cgit_doctype); | 599 | html(cgit_doctype); |
600 | html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); | 600 | html("<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>\n"); |
601 | html("<head>\n"); | 601 | html("<head>\n"); |
602 | html("<title>"); | 602 | html("<title>"); |
603 | html_txt(ctx->page.title); | 603 | html_txt(ctx->page.title); |
604 | html("</title>\n"); | 604 | html("</title>\n"); |
605 | htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); | 605 | htmlf("<meta name='generator' content='cgit %s'/>\n", cgit_version); |
606 | if (ctx->cfg.robots && *ctx->cfg.robots) | 606 | if (ctx->cfg.robots && *ctx->cfg.robots) |
607 | htmlf("<meta name='robots' content='%s'/>\n", ctx->cfg.robots); | 607 | htmlf("<meta name='robots' content='%s'/>\n", ctx->cfg.robots); |
608 | html("<link rel='stylesheet' type='text/css' href='"); | 608 | html("<link rel='stylesheet' type='text/css' href='"); |
609 | html_attr(ctx->cfg.css); | 609 | html_attr(ctx->cfg.css); |
610 | html("'/>\n"); | 610 | html("'/>\n"); |
611 | if (ctx->cfg.favicon) { | 611 | if (ctx->cfg.favicon) { |
612 | html("<link rel='shortcut icon' href='"); | 612 | html("<link rel='shortcut icon' href='"); |
613 | html_attr(ctx->cfg.favicon); | 613 | html_attr(ctx->cfg.favicon); |
614 | html("'/>\n"); | 614 | html("'/>\n"); |
615 | } | 615 | } |
616 | if (host && ctx->repo) { | 616 | if (host && ctx->repo) { |
617 | html("<link rel='alternate' title='Atom feed' href='"); | 617 | html("<link rel='alternate' title='Atom feed' href='"); |
618 | html(cgit_httpscheme()); | 618 | html(cgit_httpscheme()); |
619 | html_attr(cgit_hosturl()); | 619 | html_attr(cgit_hosturl()); |
620 | html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.vpath, | 620 | html_attr(cgit_fileurl(ctx->repo->url, "atom", ctx->qry.vpath, |
621 | fmt("h=%s", ctx->qry.head))); | 621 | fmt("h=%s", ctx->qry.head))); |
622 | html("' type='application/atom+xml'/>\n"); | 622 | html("' type='application/atom+xml'/>\n"); |
623 | } | 623 | } |
624 | if (ctx->cfg.head_include) | 624 | if (ctx->cfg.head_include) |
625 | html_include(ctx->cfg.head_include); | 625 | html_include(ctx->cfg.head_include); |
626 | html("</head>\n"); | 626 | html("</head>\n"); |
627 | html("<body>\n"); | 627 | html("<body>\n"); |
628 | if (ctx->cfg.header) | 628 | if (ctx->cfg.header) |
629 | html_include(ctx->cfg.header); | 629 | html_include(ctx->cfg.header); |
630 | } | 630 | } |
631 | 631 | ||
632 | void cgit_print_docend() | 632 | void cgit_print_docend() |
633 | { | 633 | { |
634 | html("</div> <!-- class=content -->\n"); | 634 | html("</div> <!-- class=content -->\n"); |
635 | if (ctx.cfg.embedded) { | 635 | if (ctx.cfg.embedded) { |
636 | html("</div> <!-- id=cgit -->\n"); | 636 | html("</div> <!-- id=cgit -->\n"); |
637 | if (ctx.cfg.footer) | 637 | if (ctx.cfg.footer) |
638 | html_include(ctx.cfg.footer); | 638 | html_include(ctx.cfg.footer); |
639 | return; | 639 | return; |
640 | } | 640 | } |
641 | if (ctx.cfg.footer) | 641 | if (ctx.cfg.footer) |
642 | html_include(ctx.cfg.footer); | 642 | html_include(ctx.cfg.footer); |
643 | else { | 643 | else { |
644 | htmlf("<div class='footer'>generated by cgit %s at ", | 644 | htmlf("<div class='footer'>generated by cgit %s at ", |
645 | cgit_version); | 645 | cgit_version); |
646 | cgit_print_date(time(NULL), FMT_LONGDATE, ctx.cfg.local_time); | 646 | cgit_print_date(time(NULL), FMT_LONGDATE, ctx.cfg.local_time); |
647 | html("</div>\n"); | 647 | html("</div>\n"); |
648 | } | 648 | } |
649 | html("</div> <!-- id=cgit -->\n"); | 649 | html("</div> <!-- id=cgit -->\n"); |
650 | html("</body>\n</html>\n"); | 650 | html("</body>\n</html>\n"); |
651 | } | 651 | } |
652 | 652 | ||
653 | int print_branch_option(const char *refname, const unsigned char *sha1, | 653 | int print_branch_option(const char *refname, const unsigned char *sha1, |
654 | int flags, void *cb_data) | 654 | int flags, void *cb_data) |
655 | { | 655 | { |
656 | char *name = (char *)refname; | 656 | char *name = (char *)refname; |
657 | html_option(name, name, ctx.qry.head); | 657 | html_option(name, name, ctx.qry.head); |
658 | return 0; | 658 | return 0; |
659 | } | 659 | } |
660 | 660 | ||
661 | int print_archive_ref(const char *refname, const unsigned char *sha1, | 661 | int print_archive_ref(const char *refname, const unsigned char *sha1, |
662 | int flags, void *cb_data) | 662 | int flags, void *cb_data) |
663 | { | 663 | { |
664 | struct tag *tag; | 664 | struct tag *tag; |
665 | struct taginfo *info; | 665 | struct taginfo *info; |
666 | struct object *obj; | 666 | struct object *obj; |
667 | char buf[256], *url; | 667 | char buf[256], *url; |
668 | unsigned char fileid[20]; | 668 | unsigned char fileid[20]; |
669 | int *header = (int *)cb_data; | 669 | int *header = (int *)cb_data; |
670 | 670 | ||
671 | if (prefixcmp(refname, "refs/archives")) | 671 | if (prefixcmp(refname, "refs/archives")) |
672 | return 0; | 672 | return 0; |
673 | strncpy(buf, refname+14, sizeof(buf)); | 673 | strncpy(buf, refname+14, sizeof(buf)); |
674 | obj = parse_object(sha1); | 674 | obj = parse_object(sha1); |
675 | if (!obj) | 675 | if (!obj) |
676 | return 1; | 676 | return 1; |
677 | if (obj->type == OBJ_TAG) { | 677 | if (obj->type == OBJ_TAG) { |
678 | tag = lookup_tag(sha1); | 678 | tag = lookup_tag(sha1); |
679 | if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) | 679 | if (!tag || parse_tag(tag) || !(info = cgit_parse_tag(tag))) |
680 | return 0; | 680 | return 0; |
681 | hashcpy(fileid, tag->tagged->sha1); | 681 | hashcpy(fileid, tag->tagged->sha1); |
682 | } else if (obj->type != OBJ_BLOB) { | 682 | } else if (obj->type != OBJ_BLOB) { |
683 | return 0; | 683 | return 0; |
684 | } else { | 684 | } else { |
685 | hashcpy(fileid, sha1); | 685 | hashcpy(fileid, sha1); |
686 | } | 686 | } |
687 | if (!*header) { | 687 | if (!*header) { |
688 | html("<h1>download</h1>\n"); | 688 | html("<h1>download</h1>\n"); |
689 | *header = 1; | 689 | *header = 1; |
690 | } | 690 | } |
691 | url = cgit_pageurl(ctx.qry.repo, "blob", | 691 | url = cgit_pageurl(ctx.qry.repo, "blob", |
692 | fmt("id=%s&path=%s", sha1_to_hex(fileid), | 692 | fmt("id=%s&path=%s", sha1_to_hex(fileid), |
693 | buf)); | 693 | buf)); |
694 | html_link_open(url, NULL, "menu"); | 694 | html_link_open(url, NULL, "menu"); |
695 | html_txt(strlpart(buf, 20)); | 695 | html_txt(strlpart(buf, 20)); |
696 | html_link_close(); | 696 | html_link_close(); |
697 | return 0; | 697 | return 0; |
698 | } | 698 | } |
699 | 699 | ||
700 | void cgit_add_hidden_formfields(int incl_head, int incl_search, | 700 | void cgit_add_hidden_formfields(int incl_head, int incl_search, |
701 | const char *page) | 701 | const char *page) |
702 | { | 702 | { |
703 | char *url; | 703 | char *url; |
704 | 704 | ||
705 | if (!ctx.cfg.virtual_root) { | 705 | if (!ctx.cfg.virtual_root) { |
706 | url = fmt("%s/%s", ctx.qry.repo, page); | 706 | url = fmt("%s/%s", ctx.qry.repo, page); |
707 | if (ctx.qry.vpath) | 707 | if (ctx.qry.vpath) |
708 | url = fmt("%s/%s", url, ctx.qry.vpath); | 708 | url = fmt("%s/%s", url, ctx.qry.vpath); |
709 | html_hidden("url", url); | 709 | html_hidden("url", url); |
710 | } | 710 | } |
711 | 711 | ||
712 | if (incl_head && ctx.qry.head && ctx.repo->defbranch && | 712 | if (incl_head && ctx.qry.head && ctx.repo->defbranch && |
713 | strcmp(ctx.qry.head, ctx.repo->defbranch)) | 713 | strcmp(ctx.qry.head, ctx.repo->defbranch)) |
714 | html_hidden("h", ctx.qry.head); | 714 | html_hidden("h", ctx.qry.head); |
715 | 715 | ||
716 | if (ctx.qry.sha1) | 716 | if (ctx.qry.sha1) |
717 | html_hidden("id", ctx.qry.sha1); | 717 | html_hidden("id", ctx.qry.sha1); |
718 | if (ctx.qry.sha2) | 718 | if (ctx.qry.sha2) |
719 | html_hidden("id2", ctx.qry.sha2); | 719 | html_hidden("id2", ctx.qry.sha2); |
720 | if (ctx.qry.showmsg) | 720 | if (ctx.qry.showmsg) |
721 | html_hidden("showmsg", "1"); | 721 | html_hidden("showmsg", "1"); |
722 | 722 | ||
723 | if (incl_search) { | 723 | if (incl_search) { |
724 | if (ctx.qry.grep) | 724 | if (ctx.qry.grep) |
725 | html_hidden("qt", ctx.qry.grep); | 725 | html_hidden("qt", ctx.qry.grep); |
726 | if (ctx.qry.search) | 726 | if (ctx.qry.search) |
727 | html_hidden("q", ctx.qry.search); | 727 | html_hidden("q", ctx.qry.search); |
728 | } | 728 | } |
729 | } | 729 | } |
730 | 730 | ||
731 | static const char *hc(struct cgit_context *ctx, const char *page) | 731 | static const char *hc(struct cgit_context *ctx, const char *page) |
732 | { | 732 | { |
733 | return strcmp(ctx->qry.page, page) ? NULL : "active"; | 733 | return strcmp(ctx->qry.page, page) ? NULL : "active"; |
734 | } | 734 | } |
735 | 735 | ||
736 | static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path) | 736 | static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path) |
737 | { | 737 | { |
738 | char *old_path = ctx->qry.path; | 738 | char *old_path = ctx->qry.path; |
739 | char *p = path, *q, *end = path + strlen(path); | 739 | char *p = path, *q, *end = path + strlen(path); |
740 | 740 | ||
741 | ctx->qry.path = NULL; | 741 | ctx->qry.path = NULL; |
742 | cgit_self_link("root", NULL, NULL, ctx); | 742 | cgit_self_link("root", NULL, NULL, ctx); |
743 | ctx->qry.path = p = path; | 743 | ctx->qry.path = p = path; |
744 | while (p < end) { | 744 | while (p < end) { |
745 | if (!(q = strchr(p, '/'))) | 745 | if (!(q = strchr(p, '/'))) |
746 | q = end; | 746 | q = end; |
747 | *q = '\0'; | 747 | *q = '\0'; |
748 | html_txt("/"); | 748 | html_txt("/"); |
749 | cgit_self_link(p, NULL, NULL, ctx); | 749 | cgit_self_link(p, NULL, NULL, ctx); |
750 | if (q < end) | 750 | if (q < end) |
751 | *q = '/'; | 751 | *q = '/'; |
752 | p = q + 1; | 752 | p = q + 1; |
753 | } | 753 | } |
754 | ctx->qry.path = old_path; | 754 | ctx->qry.path = old_path; |
755 | } | 755 | } |
756 | 756 | ||
757 | static void print_header(struct cgit_context *ctx) | 757 | static void print_header(struct cgit_context *ctx) |
758 | { | 758 | { |
759 | char *logo = NULL, *logo_link = NULL; | ||
760 | |||
759 | html("<table id='header'>\n"); | 761 | html("<table id='header'>\n"); |
760 | html("<tr>\n"); | 762 | html("<tr>\n"); |
761 | 763 | ||
762 | if (ctx->cfg.logo && ctx->cfg.logo[0] != 0) { | 764 | if (ctx->repo && ctx->repo->logo && *ctx->repo->logo) |
765 | logo = ctx->repo->logo; | ||
766 | else | ||
767 | logo = ctx->cfg.logo; | ||
768 | if (ctx->repo && ctx->repo->logo_link && *ctx->repo->logo_link) | ||
769 | logo_link = ctx->repo->logo_link; | ||
770 | else | ||
771 | logo_link = ctx->cfg.logo_link; | ||
772 | if (logo && *logo) { | ||
763 | html("<td class='logo' rowspan='2'><a href='"); | 773 | html("<td class='logo' rowspan='2'><a href='"); |
764 | if (ctx->cfg.logo_link) | 774 | if (logo_link && *logo_link) |
765 | html_attr(ctx->cfg.logo_link); | 775 | html_attr(logo_link); |
766 | else | 776 | else |
767 | html_attr(cgit_rooturl()); | 777 | html_attr(cgit_rooturl()); |
768 | html("'><img src='"); | 778 | html("'><img src='"); |
769 | html_attr(ctx->cfg.logo); | 779 | html_attr(logo); |
770 | html("' alt='cgit logo'/></a></td>\n"); | 780 | html("' alt='cgit logo'/></a></td>\n"); |
771 | } | 781 | } |
772 | 782 | ||
773 | html("<td class='main'>"); | 783 | html("<td class='main'>"); |
774 | if (ctx->repo) { | 784 | if (ctx->repo) { |
775 | cgit_index_link("index", NULL, NULL, NULL, 0); | 785 | cgit_index_link("index", NULL, NULL, NULL, 0); |
776 | html(" : "); | 786 | html(" : "); |
777 | cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL); | 787 | cgit_summary_link(ctx->repo->name, ctx->repo->name, NULL, NULL); |
778 | html("</td><td class='form'>"); | 788 | html("</td><td class='form'>"); |
779 | html("<form method='get' action=''>\n"); | 789 | html("<form method='get' action=''>\n"); |
780 | cgit_add_hidden_formfields(0, 1, ctx->qry.page); | 790 | cgit_add_hidden_formfields(0, 1, ctx->qry.page); |
781 | html("<select name='h' onchange='this.form.submit();'>\n"); | 791 | html("<select name='h' onchange='this.form.submit();'>\n"); |
782 | for_each_branch_ref(print_branch_option, ctx->qry.head); | 792 | for_each_branch_ref(print_branch_option, ctx->qry.head); |
783 | html("</select> "); | 793 | html("</select> "); |
784 | html("<input type='submit' name='' value='switch'/>"); | 794 | html("<input type='submit' name='' value='switch'/>"); |
785 | html("</form>"); | 795 | html("</form>"); |
786 | } else | 796 | } else |
787 | html_txt(ctx->cfg.root_title); | 797 | html_txt(ctx->cfg.root_title); |
788 | html("</td></tr>\n"); | 798 | html("</td></tr>\n"); |
789 | 799 | ||
790 | html("<tr><td class='sub'>"); | 800 | html("<tr><td class='sub'>"); |
791 | if (ctx->repo) { | 801 | if (ctx->repo) { |
792 | html_txt(ctx->repo->desc); | 802 | html_txt(ctx->repo->desc); |
793 | html("</td><td class='sub right'>"); | 803 | html("</td><td class='sub right'>"); |
794 | html_txt(ctx->repo->owner); | 804 | html_txt(ctx->repo->owner); |
795 | } else { | 805 | } else { |
796 | if (ctx->cfg.root_desc) | 806 | if (ctx->cfg.root_desc) |
797 | html_txt(ctx->cfg.root_desc); | 807 | html_txt(ctx->cfg.root_desc); |
798 | else if (ctx->cfg.index_info) | 808 | else if (ctx->cfg.index_info) |
799 | html_include(ctx->cfg.index_info); | 809 | html_include(ctx->cfg.index_info); |
800 | } | 810 | } |
801 | html("</td></tr></table>\n"); | 811 | html("</td></tr></table>\n"); |
802 | } | 812 | } |
803 | 813 | ||
804 | void cgit_print_pageheader(struct cgit_context *ctx) | 814 | void cgit_print_pageheader(struct cgit_context *ctx) |
805 | { | 815 | { |
806 | html("<div id='cgit'>"); | 816 | html("<div id='cgit'>"); |
807 | if (!ctx->cfg.noheader) | 817 | if (!ctx->cfg.noheader) |
808 | print_header(ctx); | 818 | print_header(ctx); |
809 | 819 | ||
810 | html("<table class='tabs'><tr><td>\n"); | 820 | html("<table class='tabs'><tr><td>\n"); |
811 | if (ctx->repo) { | 821 | if (ctx->repo) { |
812 | cgit_summary_link("summary", NULL, hc(ctx, "summary"), | 822 | cgit_summary_link("summary", NULL, hc(ctx, "summary"), |
813 | ctx->qry.head); | 823 | ctx->qry.head); |
814 | cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, | 824 | cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, |
815 | ctx->qry.sha1, NULL); | 825 | ctx->qry.sha1, NULL); |
816 | cgit_log_link("log", NULL, hc(ctx, "log"), ctx->qry.head, | 826 | cgit_log_link("log", NULL, hc(ctx, "log"), ctx->qry.head, |
817 | NULL, ctx->qry.vpath, 0, NULL, NULL, | 827 | NULL, ctx->qry.vpath, 0, NULL, NULL, |
818 | ctx->qry.showmsg); | 828 | ctx->qry.showmsg); |
819 | cgit_tree_link("tree", NULL, hc(ctx, "tree"), ctx->qry.head, | 829 | cgit_tree_link("tree", NULL, hc(ctx, "tree"), ctx->qry.head, |
820 | ctx->qry.sha1, ctx->qry.vpath); | 830 | ctx->qry.sha1, ctx->qry.vpath); |
821 | cgit_commit_link("commit", NULL, hc(ctx, "commit"), | 831 | cgit_commit_link("commit", NULL, hc(ctx, "commit"), |
822 | ctx->qry.head, ctx->qry.sha1, ctx->qry.vpath, 0); | 832 | ctx->qry.head, ctx->qry.sha1, ctx->qry.vpath, 0); |
823 | cgit_diff_link("diff", NULL, hc(ctx, "diff"), ctx->qry.head, | 833 | cgit_diff_link("diff", NULL, hc(ctx, "diff"), ctx->qry.head, |
824 | ctx->qry.sha1, ctx->qry.sha2, ctx->qry.vpath, 0); | 834 | ctx->qry.sha1, ctx->qry.sha2, ctx->qry.vpath, 0); |
825 | if (ctx->repo->max_stats) | 835 | if (ctx->repo->max_stats) |
826 | cgit_stats_link("stats", NULL, hc(ctx, "stats"), | 836 | cgit_stats_link("stats", NULL, hc(ctx, "stats"), |
827 | ctx->qry.head, ctx->qry.vpath); | 837 | ctx->qry.head, ctx->qry.vpath); |
828 | if (ctx->repo->readme) | 838 | if (ctx->repo->readme) |
829 | reporevlink("about", "about", NULL, | 839 | reporevlink("about", "about", NULL, |
830 | hc(ctx, "about"), ctx->qry.head, NULL, | 840 | hc(ctx, "about"), ctx->qry.head, NULL, |
831 | NULL); | 841 | NULL); |
832 | html("</td><td class='form'>"); | 842 | html("</td><td class='form'>"); |
833 | html("<form class='right' method='get' action='"); | 843 | html("<form class='right' method='get' action='"); |
834 | if (ctx->cfg.virtual_root) | 844 | if (ctx->cfg.virtual_root) |
835 | html_url_path(cgit_fileurl(ctx->qry.repo, "log", | 845 | html_url_path(cgit_fileurl(ctx->qry.repo, "log", |
836 | ctx->qry.vpath, NULL)); | 846 | ctx->qry.vpath, NULL)); |
837 | html("'>\n"); | 847 | html("'>\n"); |
838 | cgit_add_hidden_formfields(1, 0, "log"); | 848 | cgit_add_hidden_formfields(1, 0, "log"); |
839 | html("<select name='qt'>\n"); | 849 | html("<select name='qt'>\n"); |
840 | html_option("grep", "log msg", ctx->qry.grep); | 850 | html_option("grep", "log msg", ctx->qry.grep); |
841 | html_option("author", "author", ctx->qry.grep); | 851 | html_option("author", "author", ctx->qry.grep); |
842 | html_option("committer", "committer", ctx->qry.grep); | 852 | html_option("committer", "committer", ctx->qry.grep); |
843 | html_option("range", "range", ctx->qry.grep); | 853 | html_option("range", "range", ctx->qry.grep); |
844 | html("</select>\n"); | 854 | html("</select>\n"); |
845 | html("<input class='txt' type='text' size='10' name='q' value='"); | 855 | html("<input class='txt' type='text' size='10' name='q' value='"); |
846 | html_attr(ctx->qry.search); | 856 | html_attr(ctx->qry.search); |
847 | html("'/>\n"); | 857 | html("'/>\n"); |
848 | html("<input type='submit' value='search'/>\n"); | 858 | html("<input type='submit' value='search'/>\n"); |
849 | html("</form>\n"); | 859 | html("</form>\n"); |
850 | } else { | 860 | } else { |
851 | site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0); | 861 | site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0); |
852 | if (ctx->cfg.root_readme) | 862 | if (ctx->cfg.root_readme) |
853 | site_link("about", "about", NULL, hc(ctx, "about"), | 863 | site_link("about", "about", NULL, hc(ctx, "about"), |
854 | NULL, 0); | 864 | NULL, 0); |
855 | html("</td><td class='form'>"); | 865 | html("</td><td class='form'>"); |
856 | html("<form method='get' action='"); | 866 | html("<form method='get' action='"); |
857 | html_attr(cgit_rooturl()); | 867 | html_attr(cgit_rooturl()); |
858 | html("'>\n"); | 868 | html("'>\n"); |
859 | html("<input type='text' name='q' size='10' value='"); | 869 | html("<input type='text' name='q' size='10' value='"); |
860 | html_attr(ctx->qry.search); | 870 | html_attr(ctx->qry.search); |
861 | html("'/>\n"); | 871 | html("'/>\n"); |
862 | html("<input type='submit' value='search'/>\n"); | 872 | html("<input type='submit' value='search'/>\n"); |
863 | html("</form>"); | 873 | html("</form>"); |
864 | } | 874 | } |
865 | html("</td></tr></table>\n"); | 875 | html("</td></tr></table>\n"); |
866 | if (ctx->qry.vpath) { | 876 | if (ctx->qry.vpath) { |
867 | html("<div class='path'>"); | 877 | html("<div class='path'>"); |
868 | html("path: "); | 878 | html("path: "); |
869 | cgit_print_path_crumbs(ctx, ctx->qry.vpath); | 879 | cgit_print_path_crumbs(ctx, ctx->qry.vpath); |
870 | html("</div>"); | 880 | html("</div>"); |
871 | } | 881 | } |
872 | html("<div class='content'>"); | 882 | html("<div class='content'>"); |
873 | } | 883 | } |
874 | 884 | ||
875 | void cgit_print_filemode(unsigned short mode) | 885 | void cgit_print_filemode(unsigned short mode) |
876 | { | 886 | { |
877 | if (S_ISDIR(mode)) | 887 | if (S_ISDIR(mode)) |
878 | html("d"); | 888 | html("d"); |
879 | else if (S_ISLNK(mode)) | 889 | else if (S_ISLNK(mode)) |
880 | html("l"); | 890 | html("l"); |
881 | else if (S_ISGITLINK(mode)) | 891 | else if (S_ISGITLINK(mode)) |
882 | html("m"); | 892 | html("m"); |
883 | else | 893 | else |
884 | html("-"); | 894 | html("-"); |
885 | html_fileperm(mode >> 6); | 895 | html_fileperm(mode >> 6); |
886 | html_fileperm(mode >> 3); | 896 | html_fileperm(mode >> 3); |
887 | html_fileperm(mode); | 897 | html_fileperm(mode); |
888 | } | 898 | } |
889 | 899 | ||
890 | void cgit_print_snapshot_links(const char *repo, const char *head, | 900 | void cgit_print_snapshot_links(const char *repo, const char *head, |
891 | const char *hex, int snapshots) | 901 | const char *hex, int snapshots) |
892 | { | 902 | { |
893 | const struct cgit_snapshot_format* f; | 903 | const struct cgit_snapshot_format* f; |
894 | char *prefix; | 904 | char *prefix; |
895 | char *filename; | 905 | char *filename; |
896 | unsigned char sha1[20]; | 906 | unsigned char sha1[20]; |
897 | 907 | ||
898 | if (get_sha1(fmt("refs/tags/%s", hex), sha1) == 0 && | 908 | if (get_sha1(fmt("refs/tags/%s", hex), sha1) == 0 && |
899 | (hex[0] == 'v' || hex[0] == 'V') && isdigit(hex[1])) | 909 | (hex[0] == 'v' || hex[0] == 'V') && isdigit(hex[1])) |
900 | hex++; | 910 | hex++; |
901 | prefix = xstrdup(fmt("%s-%s", cgit_repobasename(repo), hex)); | 911 | prefix = xstrdup(fmt("%s-%s", cgit_repobasename(repo), hex)); |
902 | for (f = cgit_snapshot_formats; f->suffix; f++) { | 912 | for (f = cgit_snapshot_formats; f->suffix; f++) { |
903 | if (!(snapshots & f->bit)) | 913 | if (!(snapshots & f->bit)) |
904 | continue; | 914 | continue; |
905 | filename = fmt("%s%s", prefix, f->suffix); | 915 | filename = fmt("%s%s", prefix, f->suffix); |
906 | cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename); | 916 | cgit_snapshot_link(filename, NULL, NULL, NULL, NULL, filename); |
907 | html("<br/>"); | 917 | html("<br/>"); |
908 | } | 918 | } |
909 | } | 919 | } |