X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/d532c4d1612c94347427fa1afda6afb7c34e512a..5632ba35d133ee29d46c031cdd4b4a37097b8ca1:/cgit.c?ds=sidebyside diff --git a/cgit.c b/cgit.c index 497337b..c82587b 100644 --- a/cgit.c +++ b/cgit.c @@ -12,6 +12,7 @@ #include "configfile.h" #include "html.h" #include "ui-shared.h" +#include "scan-tree.h" const char *cgit_version = CGIT_VERSION; @@ -130,6 +131,7 @@ static void querystring_cb(const char *name, const char *value) } else if (!strcmp(name, "p")) { ctx.qry.page = xstrdup(value); } else if (!strcmp(name, "url")) { + ctx.qry.url = xstrdup(value); cgit_parse_url(value); } else if (!strcmp(name, "qt")) { ctx.qry.grep = xstrdup(value); @@ -252,6 +254,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx) ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); if (!ctx->qry.head) { + ctx->qry.nohead = 1; ctx->qry.head = find_default_branch(ctx->repo); ctx->repo->defbranch = ctx->qry.head; } @@ -319,9 +322,39 @@ static void process_request(void *cbdata) cgit_print_docend(); } +int cmp_repos(const void *a, const void *b) +{ + const struct cgit_repo *ra = a, *rb = b; + return strcmp(ra->url, rb->url); +} + +void print_repo(struct cgit_repo *repo) +{ + printf("repo.url=%s\n", repo->url); + printf("repo.name=%s\n", repo->name); + printf("repo.path=%s\n", repo->path); + if (repo->owner) + printf("repo.owner=%s\n", repo->owner); + if (repo->desc) + printf("repo.desc=%s\n", repo->desc); + if (repo->readme) + printf("repo.readme=%s\n", repo->readme); + printf("\n"); +} + +void print_repolist(struct cgit_repolist *list) +{ + int i; + + for(i = 0; i < list->count; i++) + print_repo(&list->repos[i]); +} + + static void cgit_parse_args(int argc, const char **argv) { int i; + int scan = 0; for (i = 1; i < argc; i++) { if (!strncmp(argv[i], "--cache=", 8)) { @@ -350,6 +383,16 @@ static void cgit_parse_args(int argc, const char **argv) if (!strncmp(argv[i], "--ofs=", 6)) { ctx.qry.ofs = atoi(argv[i]+6); } + if (!strncmp(argv[i], "--scan-tree=", 12)) { + scan++; + scan_tree(argv[i] + 12); + } + } + if (scan) { + qsort(cgit_repolist.repos, cgit_repolist.count, + sizeof(struct cgit_repo), cmp_repos); + print_repolist(&cgit_repolist); + exit(0); } } @@ -373,6 +416,8 @@ static int calc_ttl() int main(int argc, const char **argv) { const char *cgit_config_env = getenv("CGIT_CONFIG"); + const char *path; + char *qry; int err, ttl; prepare_context(&ctx); @@ -380,16 +425,40 @@ int main(int argc, const char **argv) cgit_repolist.count = 0; cgit_repolist.repos = NULL; - parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG, - config_cb); - ctx.repo = NULL; if (getenv("SCRIPT_NAME")) ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); if (getenv("QUERY_STRING")) ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); cgit_parse_args(argc, argv); + parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG, + config_cb); + ctx.repo = NULL; http_parse_querystring(ctx.qry.raw, querystring_cb); + /* If virtual-root isn't specified in cgitrc and no url + * parameter is specified on the querystring, lets pretend + * that virtualroot equals SCRIPT_NAME and use PATH_INFO as + * url. This allows cgit to work with virtual urls without + * the need for rewriterules in the webserver (as long as + * PATH_INFO is included in the cache lookup key). + */ + if (!ctx.cfg.virtual_root && !ctx.qry.url) { + ctx.cfg.virtual_root = ctx.cfg.script_name; + path = getenv("PATH_INFO"); + if (path) { + if (path[0] == '/') + path++; + ctx.qry.url = xstrdup(path); + if (ctx.qry.raw) { + qry = ctx.qry.raw; + ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); + free(qry); + } else + ctx.qry.raw = ctx.qry.url; + cgit_parse_url(ctx.qry.url); + } + } + ttl = calc_ttl(); ctx.page.expires += ttl*60; if (ctx.cfg.nocache)