X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/17838ec6304198811df97402f11c185f8f0e10bd..7ef1a47991fee31c1eb1e1292bf715d577042f35:/cgit.c diff --git a/cgit.c b/cgit.c index 796cb7f..5937b9e 100644 --- a/cgit.c +++ b/cgit.c @@ -82,6 +82,10 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va repo->logo = xstrdup(value); else if (!strcmp(name, "logo-link") && value != NULL) repo->logo_link = xstrdup(value); + else if (!strcmp(name, "hide")) + repo->hide = atoi(value); + else if (!strcmp(name, "ignore")) + repo->ignore = atoi(value); else if (ctx.cfg.enable_filter_overrides) { if (!strcmp(name, "about-filter")) repo->about_filter = cgit_new_filter(value, ABOUT); @@ -91,6 +95,8 @@ static void repo_config(struct cgit_repo *repo, const char *name, const char *va repo->source_filter = cgit_new_filter(value, SOURCE); else if (!strcmp(name, "email-filter")) repo->email_filter = cgit_new_filter(value, EMAIL); + else if (!strcmp(name, "owner-filter")) + repo->owner_filter = cgit_new_filter(value, OWNER); } } @@ -104,7 +110,7 @@ static void config_cb(const char *name, const char *value) ctx.repo->path = trim_end(value, '/'); else if (ctx.repo && starts_with(name, "repo.")) repo_config(ctx.repo, name + 5, value); - else if (!strcmp(name, "readme") && value != NULL) + else if (!strcmp(name, "readme")) string_list_append(&ctx.cfg.readme, xstrdup(value)); else if (!strcmp(name, "root-title")) ctx.cfg.root_title = xstrdup(value); @@ -146,6 +152,8 @@ static void config_cb(const char *name, const char *value) ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); else if (!strcmp(name, "enable-filter-overrides")) ctx.cfg.enable_filter_overrides = atoi(value); + else if (!strcmp(name, "enable-follow-links")) + ctx.cfg.enable_follow_links = atoi(value); else if (!strcmp(name, "enable-http-clone")) ctx.cfg.enable_http_clone = atoi(value); else if (!strcmp(name, "enable-index-links")) @@ -194,6 +202,8 @@ static void config_cb(const char *name, const char *value) ctx.cfg.commit_filter = cgit_new_filter(value, COMMIT); else if (!strcmp(name, "email-filter")) ctx.cfg.email_filter = cgit_new_filter(value, EMAIL); + else if (!strcmp(name, "owner-filter")) + ctx.cfg.owner_filter = cgit_new_filter(value, OWNER); else if (!strcmp(name, "auth-filter")) ctx.cfg.auth_filter = cgit_new_filter(value, AUTH); else if (!strcmp(name, "embedded")) @@ -325,6 +335,8 @@ static void querystring_cb(const char *name, const char *value) ctx.qry.context = atoi(value); } else if (!strcmp(name, "ignorews")) { ctx.qry.ignorews = atoi(value); + } else if (!strcmp(name, "follow")) { + ctx.qry.follow = atoi(value); } } @@ -413,7 +425,7 @@ struct refmatch { int match; }; -static int find_current_ref(const char *refname, const unsigned char *sha1, +static int find_current_ref(const char *refname, const struct object_id *oid, int flags, void *cb_data) { struct refmatch *info; @@ -528,6 +540,17 @@ static void choose_readme(struct cgit_repo *repo) string_list_append(&repo->readme, filename)->util = ref; } +static void print_no_repo_clone_urls(const char *url) +{ + html(""); + html_txt(url); + html("\n"); +} + static int prepare_repo_cmd(void) { unsigned char sha1[20]; @@ -578,6 +601,12 @@ static int prepare_repo_cmd(void) cgit_print_docstart(); cgit_print_pageheader(); cgit_print_error("Repository seems to be empty"); + if (!strcmp(ctx.qry.page, "summary")) { + html("\n"); + cgit_prepare_repo_env(ctx.repo); + cgit_add_clone_urls(print_no_repo_clone_urls); + html("
 
Clone
\n"); + } cgit_print_docend(); return 1; } @@ -585,17 +614,12 @@ static int prepare_repo_cmd(void) if (get_sha1(ctx.qry.head, sha1)) { char *tmp = xstrdup(ctx.qry.head); ctx.qry.head = ctx.repo->defbranch; - ctx.page.status = 404; - ctx.page.statusmsg = "Not found"; - cgit_print_http_headers(); - cgit_print_docstart(); - cgit_print_pageheader(); - cgit_print_error("Invalid branch: %s", tmp); - cgit_print_docend(); + cgit_print_error_page(404, "Not found", + "Invalid branch: %s", tmp); free(tmp); return 1; } - sort_string_list(&ctx.repo->submodules); + string_list_sort(&ctx.repo->submodules); cgit_prepare_repo_env(ctx.repo); choose_readme(ctx.repo); return 0; @@ -684,18 +708,13 @@ static void process_request(void) cmd = cgit_get_cmd(); if (!cmd) { ctx.page.title = "cgit error"; - ctx.page.status = 404; - ctx.page.statusmsg = "Not found"; - cgit_print_http_headers(); - cgit_print_docstart(); - cgit_print_pageheader(); - cgit_print_error("Invalid request"); - cgit_print_docend(); + cgit_print_error_page(404, "Not found", "Invalid request"); return; } if (!ctx.cfg.enable_http_clone && cmd->is_clone) { - html_status(404, "Not found", 0); + ctx.page.title = "cgit error"; + cgit_print_error_page(404, "Not found", "Invalid request"); return; } @@ -706,27 +725,15 @@ static void process_request(void) ctx.qry.vpath = cmd->want_vpath ? ctx.qry.path : NULL; if (cmd->want_repo && !ctx.repo) { - cgit_print_http_headers(); - cgit_print_docstart(); - cgit_print_pageheader(); - cgit_print_error("No repository selected"); - cgit_print_docend(); + cgit_print_error_page(400, "Bad request", + "No repository selected"); return; } if (ctx.repo && prepare_repo_cmd()) return; - if (cmd->want_layout) { - cgit_print_http_headers(); - cgit_print_docstart(); - cgit_print_pageheader(); - } - cmd->fn(); - - if (cmd->want_layout) - cgit_print_docend(); } static int cmp_repos(const void *a, const void *b) @@ -800,6 +807,8 @@ static void print_repo(FILE *f, struct cgit_repo *repo) cgit_fprintf_filter(repo->source_filter, f, "repo.source-filter="); if (repo->email_filter && repo->email_filter != ctx.cfg.email_filter) cgit_fprintf_filter(repo->email_filter, f, "repo.email-filter="); + if (repo->owner_filter && repo->owner_filter != ctx.cfg.owner_filter) + cgit_fprintf_filter(repo->owner_filter, f, "repo.owner-filter="); if (repo->snapshots != ctx.cfg.snapshots) { char *tmp = build_snapshot_setting(repo->snapshots); fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : ""); @@ -822,6 +831,8 @@ static void print_repo(FILE *f, struct cgit_repo *repo) else if (repo->commit_sort == 2) fprintf(f, "repo.commit-sort=topo\n"); } + fprintf(f, "repo.hide=%d\n", repo->hide); + fprintf(f, "repo.ignore=%d\n", repo->ignore); fprintf(f, "\n"); } @@ -985,7 +996,7 @@ static void cgit_parse_args(int argc, const char **argv) } } -static int calc_ttl() +static int calc_ttl(void) { if (!ctx.repo) return ctx.cfg.cache_root_ttl;