|
diff --git a/cgit.c b/cgit.c index e302a7c..e498030 100644 --- a/ cgit.c+++ b/ cgit.c |
|
@@ -664,131 +664,134 @@ static void process_cached_repolist(const char *path) |
664 | static void cgit_parse_args(int argc, const char **argv) |
664 | static void cgit_parse_args(int argc, const char **argv) |
665 | { |
665 | { |
666 | int i; |
666 | int i; |
667 | int scan = 0; |
667 | int scan = 0; |
668 | |
668 | |
669 | for (i = 1; i < argc; i++) { |
669 | for (i = 1; i < argc; i++) { |
670 | if (!strncmp(argv[i], "--cache=", 8)) { |
670 | if (!strncmp(argv[i], "--cache=", 8)) { |
671 | ctx.cfg.cache_root = xstrdup(argv[i]+8); |
671 | ctx.cfg.cache_root = xstrdup(argv[i]+8); |
672 | } |
672 | } |
673 | if (!strcmp(argv[i], "--nocache")) { |
673 | if (!strcmp(argv[i], "--nocache")) { |
674 | ctx.cfg.nocache = 1; |
674 | ctx.cfg.nocache = 1; |
675 | } |
675 | } |
676 | if (!strcmp(argv[i], "--nohttp")) { |
676 | if (!strcmp(argv[i], "--nohttp")) { |
677 | ctx.env.no_http = "1"; |
677 | ctx.env.no_http = "1"; |
678 | } |
678 | } |
679 | if (!strncmp(argv[i], "--query=", 8)) { |
679 | if (!strncmp(argv[i], "--query=", 8)) { |
680 | ctx.qry.raw = xstrdup(argv[i]+8); |
680 | ctx.qry.raw = xstrdup(argv[i]+8); |
681 | } |
681 | } |
682 | if (!strncmp(argv[i], "--repo=", 7)) { |
682 | if (!strncmp(argv[i], "--repo=", 7)) { |
683 | ctx.qry.repo = xstrdup(argv[i]+7); |
683 | ctx.qry.repo = xstrdup(argv[i]+7); |
684 | } |
684 | } |
685 | if (!strncmp(argv[i], "--page=", 7)) { |
685 | if (!strncmp(argv[i], "--page=", 7)) { |
686 | ctx.qry.page = xstrdup(argv[i]+7); |
686 | ctx.qry.page = xstrdup(argv[i]+7); |
687 | } |
687 | } |
688 | if (!strncmp(argv[i], "--head=", 7)) { |
688 | if (!strncmp(argv[i], "--head=", 7)) { |
689 | ctx.qry.head = xstrdup(argv[i]+7); |
689 | ctx.qry.head = xstrdup(argv[i]+7); |
690 | ctx.qry.has_symref = 1; |
690 | ctx.qry.has_symref = 1; |
691 | } |
691 | } |
692 | if (!strncmp(argv[i], "--sha1=", 7)) { |
692 | if (!strncmp(argv[i], "--sha1=", 7)) { |
693 | ctx.qry.sha1 = xstrdup(argv[i]+7); |
693 | ctx.qry.sha1 = xstrdup(argv[i]+7); |
694 | ctx.qry.has_sha1 = 1; |
694 | ctx.qry.has_sha1 = 1; |
695 | } |
695 | } |
696 | if (!strncmp(argv[i], "--ofs=", 6)) { |
696 | if (!strncmp(argv[i], "--ofs=", 6)) { |
697 | ctx.qry.ofs = atoi(argv[i]+6); |
697 | ctx.qry.ofs = atoi(argv[i]+6); |
698 | } |
698 | } |
699 | if (!strncmp(argv[i], "--scan-tree=", 12) || |
699 | if (!strncmp(argv[i], "--scan-tree=", 12) || |
700 | !strncmp(argv[i], "--scan-path=", 12)) { |
700 | !strncmp(argv[i], "--scan-path=", 12)) { |
701 | /* HACK: the global snapshot bitmask defines the |
701 | /* HACK: the global snapshot bitmask defines the |
702 | * set of allowed snapshot formats, but the config |
702 | * set of allowed snapshot formats, but the config |
703 | * file hasn't been parsed yet so the mask is |
703 | * file hasn't been parsed yet so the mask is |
704 | * currently 0. By setting all bits high before |
704 | * currently 0. By setting all bits high before |
705 | * scanning we make sure that any in-repo cgitrc |
705 | * scanning we make sure that any in-repo cgitrc |
706 | * snapshot setting is respected by scan_tree(). |
706 | * snapshot setting is respected by scan_tree(). |
707 | * BTW: we assume that there'll never be more than |
707 | * BTW: we assume that there'll never be more than |
708 | * 255 different snapshot formats supported by cgit... |
708 | * 255 different snapshot formats supported by cgit... |
709 | */ |
709 | */ |
710 | ctx.cfg.snapshots = 0xFF; |
710 | ctx.cfg.snapshots = 0xFF; |
711 | scan++; |
711 | scan++; |
712 | scan_tree(argv[i] + 12, repo_config); |
712 | scan_tree(argv[i] + 12, repo_config); |
713 | } |
713 | } |
714 | } |
714 | } |
715 | if (scan) { |
715 | if (scan) { |
716 | qsort(cgit_repolist.repos, cgit_repolist.count, |
716 | qsort(cgit_repolist.repos, cgit_repolist.count, |
717 | sizeof(struct cgit_repo), cmp_repos); |
717 | sizeof(struct cgit_repo), cmp_repos); |
718 | print_repolist(stdout, &cgit_repolist, 0); |
718 | print_repolist(stdout, &cgit_repolist, 0); |
719 | exit(0); |
719 | exit(0); |
720 | } |
720 | } |
721 | } |
721 | } |
722 | |
722 | |
723 | static int calc_ttl() |
723 | static int calc_ttl() |
724 | { |
724 | { |
725 | if (!ctx.repo) |
725 | if (!ctx.repo) |
726 | return ctx.cfg.cache_root_ttl; |
726 | return ctx.cfg.cache_root_ttl; |
727 | |
727 | |
728 | if (!ctx.qry.page) |
728 | if (!ctx.qry.page) |
729 | return ctx.cfg.cache_repo_ttl; |
729 | return ctx.cfg.cache_repo_ttl; |
730 | |
730 | |
731 | if (ctx.qry.has_symref) |
731 | if (ctx.qry.has_symref) |
732 | return ctx.cfg.cache_dynamic_ttl; |
732 | return ctx.cfg.cache_dynamic_ttl; |
733 | |
733 | |
734 | if (ctx.qry.has_sha1) |
734 | if (ctx.qry.has_sha1) |
735 | return ctx.cfg.cache_static_ttl; |
735 | return ctx.cfg.cache_static_ttl; |
736 | |
736 | |
737 | return ctx.cfg.cache_repo_ttl; |
737 | return ctx.cfg.cache_repo_ttl; |
738 | } |
738 | } |
739 | |
739 | |
740 | int main(int argc, const char **argv) |
740 | int main(int argc, const char **argv) |
741 | { |
741 | { |
742 | const char *path; |
742 | const char *path; |
743 | char *qry; |
743 | char *qry; |
744 | int err, ttl; |
744 | int err, ttl; |
745 | |
745 | |
746 | prepare_context(&ctx); |
746 | prepare_context(&ctx); |
747 | cgit_repolist.length = 0; |
747 | cgit_repolist.length = 0; |
748 | cgit_repolist.count = 0; |
748 | cgit_repolist.count = 0; |
749 | cgit_repolist.repos = NULL; |
749 | cgit_repolist.repos = NULL; |
750 | |
750 | |
751 | cgit_parse_args(argc, argv); |
751 | cgit_parse_args(argc, argv); |
752 | parse_configfile(expand_macros(ctx.env.cgit_config), config_cb); |
752 | parse_configfile(expand_macros(ctx.env.cgit_config), config_cb); |
753 | ctx.repo = NULL; |
753 | ctx.repo = NULL; |
754 | http_parse_querystring(ctx.qry.raw, querystring_cb); |
754 | http_parse_querystring(ctx.qry.raw, querystring_cb); |
755 | |
755 | |
756 | /* If virtual-root isn't specified in cgitrc, lets pretend |
756 | /* If virtual-root isn't specified in cgitrc, lets pretend |
757 | * that virtual-root equals SCRIPT_NAME, minus any possibly |
757 | * that virtual-root equals SCRIPT_NAME, minus any possibly |
758 | * trailing slashes. |
758 | * trailing slashes. |
759 | */ |
759 | */ |
760 | if (!ctx.cfg.virtual_root) |
760 | if (!ctx.cfg.virtual_root && ctx.cfg.script_name) { |
761 | ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/'); |
761 | ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/'); |
| |
762 | if (!ctx.cfg.virtual_root) |
| |
763 | ctx.cfg.virtual_root = ""; |
| |
764 | } |
762 | |
765 | |
763 | /* If no url parameter is specified on the querystring, lets |
766 | /* If no url parameter is specified on the querystring, lets |
764 | * use PATH_INFO as url. This allows cgit to work with virtual |
767 | * use PATH_INFO as url. This allows cgit to work with virtual |
765 | * urls without the need for rewriterules in the webserver (as |
768 | * urls without the need for rewriterules in the webserver (as |
766 | * long as PATH_INFO is included in the cache lookup key). |
769 | * long as PATH_INFO is included in the cache lookup key). |
767 | */ |
770 | */ |
768 | path = ctx.env.path_info; |
771 | path = ctx.env.path_info; |
769 | if (!ctx.qry.url && path) { |
772 | if (!ctx.qry.url && path) { |
770 | if (path[0] == '/') |
773 | if (path[0] == '/') |
771 | path++; |
774 | path++; |
772 | ctx.qry.url = xstrdup(path); |
775 | ctx.qry.url = xstrdup(path); |
773 | if (ctx.qry.raw) { |
776 | if (ctx.qry.raw) { |
774 | qry = ctx.qry.raw; |
777 | qry = ctx.qry.raw; |
775 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); |
778 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); |
776 | free(qry); |
779 | free(qry); |
777 | } else |
780 | } else |
778 | ctx.qry.raw = xstrdup(ctx.qry.url); |
781 | ctx.qry.raw = xstrdup(ctx.qry.url); |
779 | cgit_parse_url(ctx.qry.url); |
782 | cgit_parse_url(ctx.qry.url); |
780 | } |
783 | } |
781 | |
784 | |
782 | ttl = calc_ttl(); |
785 | ttl = calc_ttl(); |
783 | ctx.page.expires += ttl*60; |
786 | ctx.page.expires += ttl*60; |
784 | if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) |
787 | if (ctx.env.request_method && !strcmp(ctx.env.request_method, "HEAD")) |
785 | ctx.cfg.nocache = 1; |
788 | ctx.cfg.nocache = 1; |
786 | if (ctx.cfg.nocache) |
789 | if (ctx.cfg.nocache) |
787 | ctx.cfg.cache_size = 0; |
790 | ctx.cfg.cache_size = 0; |
788 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, |
791 | err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, |
789 | ctx.qry.raw, ttl, process_request, &ctx); |
792 | ctx.qry.raw, ttl, process_request, &ctx); |
790 | if (err) |
793 | if (err) |
791 | cgit_print_error(fmt("Error processing page: %s (%d)", |
794 | cgit_print_error(fmt("Error processing page: %s (%d)", |
792 | strerror(err), err)); |
795 | strerror(err), err)); |
793 | return err; |
796 | return err; |
794 | } |
797 | } |
|