Diffstat (limited to 'cgit.c')
| -rw-r--r-- | cgit.c | 171 |
1 files changed, 67 insertions, 104 deletions
@@ -1,11 +1,6 @@ /* cgit.c: cgi for the git scm * * Copyright (C) 2006-2014 cgit Development Team <cgit@lists.zx2c4.com> - * Copyright (C) 2026 Saya Andy <saya.andy@posteo.com> - * - * Modified 2026 by Saya Andy: - * Always check there is git repo on repo.path - * Allow to include multiple favicons * * Licensed under GNU General Public License v2 * (see COPYING for full license text) @@ -46,47 +41,31 @@ static void add_mimetype(const char *name, const char *value) static void process_cached_repolist(const char *path); -void cgit_repo_config(struct cgit_repo *repo, const char *name, const char *value) +static void repo_config(struct cgit_repo *repo, const char *name, const char *value) { const char *path; struct string_list_item *item; if (!strcmp(name, "name")) - repo->name = strdup_first_line(value); + repo->name = xstrdup(value); else if (!strcmp(name, "clone-url")) - repo->clone_url = strdup_first_line(value); + repo->clone_url = xstrdup(value); else if (!strcmp(name, "desc")) - repo->desc = strdup_first_line(value); + repo->desc = xstrdup(value); else if (!strcmp(name, "owner")) - repo->owner = strdup_first_line(value); + repo->owner = xstrdup(value); else if (!strcmp(name, "homepage")) - repo->homepage = strdup_first_line(value); - else if (!strcmp(name, "ci-url")) { - repo->ci_url = strdup_first_line(value); - /* An explicit repo.ci-url would otherwise never be used - * when the more specific urls are inherited from the - * global settings, so discard those. - */ - if (repo->ci_branch_url == ctx.cfg.ci_branch_url) - repo->ci_branch_url = NULL; - if (repo->ci_tag_url == ctx.cfg.ci_tag_url) - repo->ci_tag_url = NULL; - } else if (!strcmp(name, "ci-branch-url")) - repo->ci_branch_url = strdup_first_line(value); - else if (!strcmp(name, "ci-tag-url")) - repo->ci_tag_url = strdup_first_line(value); + repo->homepage = xstrdup(value); else if (!strcmp(name, "defbranch")) - repo->defbranch = strdup_first_line(value); + repo->defbranch = xstrdup(value); else if (!strcmp(name, "extra-head-content")) - repo->extra_head_content = strdup_first_line(value); + repo->extra_head_content = xstrdup(value); else if (!strcmp(name, "snapshots")) repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); else if (!strcmp(name, "enable-blame")) repo->enable_blame = atoi(value); else if (!strcmp(name, "enable-commit-graph")) repo->enable_commit_graph = atoi(value); - else if (!strcmp(name, "enable-follow-links")) - repo->enable_follow_links = atoi(value); else if (!strcmp(name, "enable-log-filecount")) repo->enable_log_filecount = atoi(value); else if (!strcmp(name, "enable-log-linecount")) @@ -110,22 +89,22 @@ void cgit_repo_config(struct cgit_repo *repo, const char *name, const char *valu } else if (!strcmp(name, "max-stats")) repo->max_stats = cgit_find_stats_period(value, NULL); else if (!strcmp(name, "module-link")) - repo->module_link= strdup_first_line(value); + repo->module_link= xstrdup(value); else if (skip_prefix(name, "module-link.", &path)) { - item = string_list_append(&repo->submodules, strdup_first_line(path)); - item->util = strdup_first_line(value); + item = string_list_append(&repo->submodules, xstrdup(path)); + item->util = xstrdup(value); } else if (!strcmp(name, "section")) - repo->section = strdup_first_line(value); + repo->section = xstrdup(value); else if (!strcmp(name, "snapshot-prefix")) - repo->snapshot_prefix = strdup_first_line(value); + repo->snapshot_prefix = xstrdup(value); else if (!strcmp(name, "readme") && value != NULL) { if (repo->readme.items == ctx.cfg.readme.items) memset(&repo->readme, 0, sizeof(repo->readme)); - string_list_append(&repo->readme, strdup_first_line(value)); + string_list_append(&repo->readme, xstrdup(value)); } else if (!strcmp(name, "logo") && value != NULL) - repo->logo = strdup_first_line(value); + repo->logo = xstrdup(value); else if (!strcmp(name, "logo-link") && value != NULL) - repo->logo_link = strdup_first_line(value); + repo->logo_link = xstrdup(value); else if (!strcmp(name, "hide")) repo->hide = atoi(value); else if (!strcmp(name, "ignore")) @@ -141,8 +120,6 @@ void cgit_repo_config(struct cgit_repo *repo, const char *name, const char *valu repo->email_filter = cgit_new_filter(value, EMAIL); else if (!strcmp(name, "owner-filter")) repo->owner_filter = cgit_new_filter(value, OWNER); - else if (!strcmp(name, "ci-filter")) - repo->ci_filter = cgit_new_filter(value, CI); } } @@ -151,47 +128,41 @@ static void config_cb(const char *name, const char *value) const char *arg; if (!strcmp(name, "section")) - ctx.cfg.section = strdup_first_line(value); + ctx.cfg.section = xstrdup(value); else if (!strcmp(name, "repo.url")) ctx.repo = cgit_add_repo(value); else if (ctx.repo && !strcmp(name, "repo.path")) ctx.repo->path = trim_end(value, '/'); else if (ctx.repo && skip_prefix(name, "repo.", &arg)) - cgit_repo_config(ctx.repo, arg, value); + repo_config(ctx.repo, arg, value); else if (!strcmp(name, "readme")) - string_list_append(&ctx.cfg.readme, strdup_first_line(value)); + string_list_append(&ctx.cfg.readme, xstrdup(value)); else if (!strcmp(name, "root-title")) - ctx.cfg.root_title = strdup_first_line(value); + ctx.cfg.root_title = xstrdup(value); else if (!strcmp(name, "root-desc")) - ctx.cfg.root_desc = strdup_first_line(value); + ctx.cfg.root_desc = xstrdup(value); else if (!strcmp(name, "root-readme")) - ctx.cfg.root_readme = strdup_first_line(value); + ctx.cfg.root_readme = xstrdup(value); else if (!strcmp(name, "css")) - string_list_append(&ctx.cfg.css, strdup_first_line(value)); + string_list_append(&ctx.cfg.css, xstrdup(value)); else if (!strcmp(name, "js")) - string_list_append(&ctx.cfg.js, strdup_first_line(value)); + string_list_append(&ctx.cfg.js, xstrdup(value)); else if (!strcmp(name, "favicon")) - string_list_append(&ctx.cfg.favicon, strdup_first_line(value)); + ctx.cfg.favicon = xstrdup(value); else if (!strcmp(name, "footer")) - ctx.cfg.footer = strdup_first_line(value); + ctx.cfg.footer = xstrdup(value); else if (!strcmp(name, "head-include")) - ctx.cfg.head_include = strdup_first_line(value); + ctx.cfg.head_include = xstrdup(value); else if (!strcmp(name, "header")) - ctx.cfg.header = strdup_first_line(value); + ctx.cfg.header = xstrdup(value); else if (!strcmp(name, "logo")) - ctx.cfg.logo = strdup_first_line(value); + ctx.cfg.logo = xstrdup(value); else if (!strcmp(name, "logo-link")) - ctx.cfg.logo_link = strdup_first_line(value); + ctx.cfg.logo_link = xstrdup(value); else if (!strcmp(name, "module-link")) - ctx.cfg.module_link = strdup_first_line(value); - else if (!strcmp(name, "ci-url")) - ctx.cfg.ci_url = strdup_first_line(value); - else if (!strcmp(name, "ci-branch-url")) - ctx.cfg.ci_branch_url = strdup_first_line(value); - else if (!strcmp(name, "ci-tag-url")) - ctx.cfg.ci_tag_url = strdup_first_line(value); + ctx.cfg.module_link = xstrdup(value); else if (!strcmp(name, "strict-export")) - ctx.cfg.strict_export = strdup_first_line(value); + ctx.cfg.strict_export = xstrdup(value); else if (!strcmp(name, "virtual-root")) ctx.cfg.virtual_root = ensure_end(value, '/'); else if (!strcmp(name, "noplainemail")) @@ -233,7 +204,7 @@ static void config_cb(const char *name, const char *value) else if (!strcmp(name, "cache-size")) ctx.cfg.cache_size = atoi(value); else if (!strcmp(name, "cache-root")) - ctx.cfg.cache_root = strdup_first_line(expand_macros(value)); + ctx.cfg.cache_root = xstrdup(expand_macros(value)); else if (!strcmp(name, "cache-root-ttl")) ctx.cfg.cache_root_ttl = atoi(value); else if (!strcmp(name, "cache-repo-ttl")) @@ -260,8 +231,6 @@ static void config_cb(const char *name, const char *value) 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, "ci-filter")) - ctx.cfg.ci_filter = cgit_new_filter(value, CI); else if (!strcmp(name, "embedded")) ctx.cfg.embedded = atoi(value); else if (!strcmp(name, "max-atom-items")) @@ -279,21 +248,21 @@ static void config_cb(const char *name, const char *value) } else if (!strcmp(name, "max-commit-count")) ctx.cfg.max_commit_count = atoi(value); else if (!strcmp(name, "project-list")) - ctx.cfg.project_list = strdup_first_line(expand_macros(value)); + ctx.cfg.project_list = xstrdup(expand_macros(value)); else if (!strcmp(name, "scan-path")) if (ctx.cfg.cache_size) process_cached_repolist(expand_macros(value)); else if (ctx.cfg.project_list) scan_projects(expand_macros(value), - ctx.cfg.project_list); + ctx.cfg.project_list, repo_config); else - scan_tree(expand_macros(value)); + scan_tree(expand_macros(value), repo_config); else if (!strcmp(name, "scan-hidden-path")) ctx.cfg.scan_hidden_path = atoi(value); else if (!strcmp(name, "section-from-path")) ctx.cfg.section_from_path = atoi(value); else if (!strcmp(name, "repository-sort")) - ctx.cfg.repository_sort = strdup_first_line(value); + ctx.cfg.repository_sort = xstrdup(value); else if (!strcmp(name, "section-sort")) ctx.cfg.section_sort = atoi(value); else if (!strcmp(name, "source-filter")) @@ -307,19 +276,19 @@ static void config_cb(const char *name, const char *value) else if (!strcmp(name, "side-by-side-diffs")) ctx.cfg.difftype = atoi(value) ? DIFF_SSDIFF : DIFF_UNIFIED; else if (!strcmp(name, "agefile")) - ctx.cfg.agefile = strdup_first_line(value); + ctx.cfg.agefile = xstrdup(value); else if (!strcmp(name, "mimetype-file")) - ctx.cfg.mimetype_file = strdup_first_line(value); + ctx.cfg.mimetype_file = xstrdup(value); else if (!strcmp(name, "renamelimit")) ctx.cfg.renamelimit = atoi(value); else if (!strcmp(name, "remove-suffix")) ctx.cfg.remove_suffix = atoi(value); else if (!strcmp(name, "robots")) - ctx.cfg.robots = strdup_first_line(value); + ctx.cfg.robots = xstrdup(value); else if (!strcmp(name, "clone-prefix")) - ctx.cfg.clone_prefix = strdup_first_line(value); + ctx.cfg.clone_prefix = xstrdup(value); else if (!strcmp(name, "clone-url")) - ctx.cfg.clone_url = strdup_first_line(value); + ctx.cfg.clone_url = xstrdup(value); else if (!strcmp(name, "local-time")) ctx.cfg.local_time = atoi(value); else if (!strcmp(name, "commit-sort")) { @@ -413,7 +382,8 @@ static void prepare_context(void) ctx.cfg.case_sensitive_sort = 1; ctx.cfg.branch_sort = 0; ctx.cfg.commit_sort = 0; - ctx.cfg.logo = "/cgit.svg"; + ctx.cfg.logo = "/cgit.png"; + ctx.cfg.favicon = "/favicon.ico"; ctx.cfg.local_time = 0; ctx.cfg.enable_http_clone = 1; ctx.cfg.enable_index_owner = 1; @@ -615,12 +585,9 @@ static void prepare_repo_env(int *nongit) /* Setup the git directory and initialize the notes system. Both of these * load local configuration from the git repository, so we do them both while - * the HOME variables are unset. Initializing the notes system requires an - * actual repository, as it would otherwise dereference the not yet known - * hash algorithm. */ + * the HOME variables are unset. */ setup_git_directory_gently(nongit); - if (!*nongit) - load_display_notes(NULL); + load_display_notes(NULL); } static int prepare_repo_cmd(int nongit) @@ -817,6 +784,15 @@ static char *build_snapshot_setting(int bitmap) return strbuf_detach(&result, NULL); } +static char *get_first_line(char *txt) +{ + char *t = xstrdup(txt); + char *p = strchr(t, '\n'); + if (p) + *p = '\0'; + return t; +} + static void print_repo(FILE *f, struct cgit_repo *repo) { struct string_list_item *item; @@ -825,8 +801,11 @@ static void print_repo(FILE *f, struct cgit_repo *repo) fprintf(f, "repo.path=%s\n", repo->path); if (repo->owner) fprintf(f, "repo.owner=%s\n", repo->owner); - if (repo->desc) - fprintf(f, "repo.desc=%s\n", repo->desc); + if (repo->desc) { + char *tmp = get_first_line(repo->desc); + fprintf(f, "repo.desc=%s\n", tmp); + free(tmp); + } for_each_string_list_item(item, &repo->readme) { if (item->util) fprintf(f, "repo.readme=%s:%s\n", (char *)item->util, item->string); @@ -843,20 +822,12 @@ static void print_repo(FILE *f, struct cgit_repo *repo) fprintf(f, "repo.section=%s\n", repo->section); if (repo->homepage) fprintf(f, "repo.homepage=%s\n", repo->homepage); - if (repo->ci_url) - fprintf(f, "repo.ci-url=%s\n", repo->ci_url); - if (repo->ci_branch_url) - fprintf(f, "repo.ci-branch-url=%s\n", repo->ci_branch_url); - if (repo->ci_tag_url) - fprintf(f, "repo.ci-tag-url=%s\n", repo->ci_tag_url); if (repo->clone_url) fprintf(f, "repo.clone-url=%s\n", repo->clone_url); fprintf(f, "repo.enable-blame=%d\n", repo->enable_blame); fprintf(f, "repo.enable-commit-graph=%d\n", repo->enable_commit_graph); - fprintf(f, "repo.enable-follow-links=%d\n", - repo->enable_follow_links); fprintf(f, "repo.enable-log-filecount=%d\n", repo->enable_log_filecount); fprintf(f, "repo.enable-log-linecount=%d\n", @@ -871,8 +842,6 @@ static void print_repo(FILE *f, struct cgit_repo *repo) 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->ci_filter && repo->ci_filter != ctx.cfg.ci_filter) - cgit_fprintf_filter(repo->ci_filter, f, "repo.ci-filter="); if (repo->snapshots != ctx.cfg.snapshots) { char *tmp = build_snapshot_setting(repo->snapshots); fprintf(f, "repo.snapshots=%s\n", tmp ? tmp : ""); @@ -935,9 +904,9 @@ static int generate_cached_repolist(const char *path, const char *cached_rc) } idx = cgit_repolist.count; if (ctx.cfg.project_list) - scan_projects(path, ctx.cfg.project_list); + scan_projects(path, ctx.cfg.project_list, repo_config); else - scan_tree(path); + scan_tree(path, repo_config); print_repolist(f, &cgit_repolist, idx); if (rename(locked_rc.buf, cached_rc)) fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n", @@ -967,9 +936,10 @@ static void process_cached_repolist(const char *path) */ if (generate_cached_repolist(path, cached_rc.buf)) { if (ctx.cfg.project_list) - scan_projects(path, ctx.cfg.project_list); + scan_projects(path, ctx.cfg.project_list, + repo_config); else - scan_tree(path); + scan_tree(path, repo_config); } goto out; } @@ -1001,7 +971,7 @@ static void cgit_parse_args(int argc, const char **argv) for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "--version")) { - printf("CGit %s | https://sayag.it/cgitext.git | https://git.zx2c4.com/cgit/\n\nCompiled in features:\n", CGIT_VERSION); + printf("CGit %s | https://git.zx2c4.com/cgit/\n\nCompiled in features:\n", CGIT_VERSION); #ifdef NO_LUA printf("[-] "); #else @@ -1050,7 +1020,7 @@ static void cgit_parse_args(int argc, const char **argv) */ ctx.cfg.snapshots = 0xFF; scan++; - scan_tree(arg); + scan_tree(arg, repo_config); } } if (scan) { @@ -1084,12 +1054,6 @@ static int calc_ttl(void) return ctx.cfg.cache_repo_ttl; } -static NORETURN void cgit_die_routine(const char *msg, va_list params) -{ - cgit_vprint_error_page(400, "Bad request", msg, params); - exit(0); -} - int cmd_main(int argc, const char **argv) { const char *path; @@ -1097,7 +1061,6 @@ int cmd_main(int argc, const char **argv) cgit_init_filters(); atexit(cgit_cleanup_filters); - set_die_routine(cgit_die_routine); prepare_context(); cgit_repolist.length = 0; |