Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package cgit for openSUSE:Factory checked in at 2026-06-16 13:58:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cgit (Old) and /work/SRC/openSUSE:Factory/.cgit.new.1981 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cgit" Tue Jun 16 13:58:10 2026 rev:37 rq:1359715 version:1.3.1 Changes: -------- --- /work/SRC/openSUSE:Factory/cgit/cgit.changes 2026-03-19 17:41:49.888882441 +0100 +++ /work/SRC/openSUSE:Factory/.cgit.new.1981/cgit.changes 2026-06-16 14:05:03.858284887 +0200 @@ -1,0 +2,14 @@ +Tue Jun 16 07:18:46 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 1.3.1 + * Allow link following to be disabled per-repo, so that this CPU + intensive operation can be disabled on specific repos. + * More gracefully error out if a bad grep pattern is passed. + * Truncate cache slots before writing them, so that old cache + contents are not mixed with new cache contents improperly. + * Do not accept newlines in config items. This fixes an issue + with `git-config` based configuration settings being able to + inject cached global settings or per-repo settings for + different repos, which might be crossing a privilege barrier. + +------------------------------------------------------------------- Old: ---- cgit-1.3.tar.xz git-2.53.0.tar.sign git-2.53.0.tar.xz New: ---- cgit-1.3.1.tar.xz git-2.54.0.tar.sign git-2.54.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cgit.spec ++++++ --- /var/tmp/diff_new_pack.SQMu46/_old 2026-06-16 14:05:05.510353634 +0200 +++ /var/tmp/diff_new_pack.SQMu46/_new 2026-06-16 14:05:05.514353800 +0200 @@ -1,7 +1,7 @@ # # spec file for package cgit # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,9 +16,9 @@ # -%define git_version 2.53.0 +%define git_version 2.54.0 Name: cgit -Version: 1.3 +Version: 1.3.1 Release: 0 Summary: A web frontend for git repositories License: GPL-2.0-only @@ -34,8 +34,8 @@ BuildRequires: asciidoc # Requirements for cgit BuildRequires: libxslt -BuildRequires: xz BuildRequires: nginx +BuildRequires: xz BuildRequires: pkgconfig(libzip) BuildRequires: pkgconfig(openssl) BuildRequires: pkgconfig(zlib) ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.SQMu46/_old 2026-06-16 14:05:05.554355465 +0200 +++ /var/tmp/diff_new_pack.SQMu46/_new 2026-06-16 14:05:05.558355631 +0200 @@ -1,5 +1,5 @@ -mtime: 1773912503 -commit: 20e220b2d1924118971e9447f23bf6b311ff04d0daa778b700cea5d39ef28ec5 +mtime: 1781594395 +commit: 21f48ea12f96717cb74f5804d25b076ed280c1c5c851ed056bec746717a3097f url: https://src.opensuse.org/jengelh/cgit revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-06-16 09:19:55.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ cgit-1.3.tar.xz -> cgit-1.3.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/Makefile new/cgit-1.3.1/Makefile --- old/cgit-1.3/Makefile 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/Makefile 2026-05-04 23:03:51.000000000 +0200 @@ -1,6 +1,6 @@ all:: -CGIT_VERSION = v1.3 +CGIT_VERSION = v1.3.1 CGIT_SCRIPT_NAME = cgit.cgi CGIT_SCRIPT_PATH = /var/www/htdocs/cgit CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH) @@ -14,7 +14,7 @@ pdfdir = $(docdir) mandir = $(prefix)/share/man SHA1_HEADER = <openssl/sha.h> -GIT_VER = 2.53.0 +GIT_VER = 2.54.0 GIT_URL = https://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.xz INSTALL = install COPYTREE = cp -r diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/cache.c new/cgit-1.3.1/cache.c --- old/cgit-1.3/cache.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/cache.c 2026-05-04 23:03:51.000000000 +0200 @@ -185,6 +185,8 @@ slot->lock_fd = -1; return saved_errno; } + if (ftruncate(slot->lock_fd, 0) < 0) + return errno; if (xwrite(slot->lock_fd, slot->key, slot->keylen + 1) < 0) return errno; return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/cgit.c new/cgit-1.3.1/cgit.c --- old/cgit-1.3/cgit.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/cgit.c 2026-05-04 23:03:51.000000000 +0200 @@ -41,31 +41,33 @@ static void process_cached_repolist(const char *path); -static void repo_config(struct cgit_repo *repo, const char *name, const char *value) +void cgit_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 = xstrdup(value); + repo->name = strdup_first_line(value); else if (!strcmp(name, "clone-url")) - repo->clone_url = xstrdup(value); + repo->clone_url = strdup_first_line(value); else if (!strcmp(name, "desc")) - repo->desc = xstrdup(value); + repo->desc = strdup_first_line(value); else if (!strcmp(name, "owner")) - repo->owner = xstrdup(value); + repo->owner = strdup_first_line(value); else if (!strcmp(name, "homepage")) - repo->homepage = xstrdup(value); + repo->homepage = strdup_first_line(value); else if (!strcmp(name, "defbranch")) - repo->defbranch = xstrdup(value); + repo->defbranch = strdup_first_line(value); else if (!strcmp(name, "extra-head-content")) - repo->extra_head_content = xstrdup(value); + repo->extra_head_content = strdup_first_line(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")) @@ -89,22 +91,22 @@ } else if (!strcmp(name, "max-stats")) repo->max_stats = cgit_find_stats_period(value, NULL); else if (!strcmp(name, "module-link")) - repo->module_link= xstrdup(value); + repo->module_link= strdup_first_line(value); else if (skip_prefix(name, "module-link.", &path)) { - item = string_list_append(&repo->submodules, xstrdup(path)); - item->util = xstrdup(value); + item = string_list_append(&repo->submodules, strdup_first_line(path)); + item->util = strdup_first_line(value); } else if (!strcmp(name, "section")) - repo->section = xstrdup(value); + repo->section = strdup_first_line(value); else if (!strcmp(name, "snapshot-prefix")) - repo->snapshot_prefix = xstrdup(value); + repo->snapshot_prefix = strdup_first_line(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, xstrdup(value)); + string_list_append(&repo->readme, strdup_first_line(value)); } else if (!strcmp(name, "logo") && value != NULL) - repo->logo = xstrdup(value); + repo->logo = strdup_first_line(value); else if (!strcmp(name, "logo-link") && value != NULL) - repo->logo_link = xstrdup(value); + repo->logo_link = strdup_first_line(value); else if (!strcmp(name, "hide")) repo->hide = atoi(value); else if (!strcmp(name, "ignore")) @@ -128,41 +130,41 @@ const char *arg; if (!strcmp(name, "section")) - ctx.cfg.section = xstrdup(value); + ctx.cfg.section = strdup_first_line(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)) - repo_config(ctx.repo, arg, value); + cgit_repo_config(ctx.repo, arg, value); else if (!strcmp(name, "readme")) - string_list_append(&ctx.cfg.readme, xstrdup(value)); + string_list_append(&ctx.cfg.readme, strdup_first_line(value)); else if (!strcmp(name, "root-title")) - ctx.cfg.root_title = xstrdup(value); + ctx.cfg.root_title = strdup_first_line(value); else if (!strcmp(name, "root-desc")) - ctx.cfg.root_desc = xstrdup(value); + ctx.cfg.root_desc = strdup_first_line(value); else if (!strcmp(name, "root-readme")) - ctx.cfg.root_readme = xstrdup(value); + ctx.cfg.root_readme = strdup_first_line(value); else if (!strcmp(name, "css")) - string_list_append(&ctx.cfg.css, xstrdup(value)); + string_list_append(&ctx.cfg.css, strdup_first_line(value)); else if (!strcmp(name, "js")) - string_list_append(&ctx.cfg.js, xstrdup(value)); + string_list_append(&ctx.cfg.js, strdup_first_line(value)); else if (!strcmp(name, "favicon")) - ctx.cfg.favicon = xstrdup(value); + ctx.cfg.favicon = strdup_first_line(value); else if (!strcmp(name, "footer")) - ctx.cfg.footer = xstrdup(value); + ctx.cfg.footer = strdup_first_line(value); else if (!strcmp(name, "head-include")) - ctx.cfg.head_include = xstrdup(value); + ctx.cfg.head_include = strdup_first_line(value); else if (!strcmp(name, "header")) - ctx.cfg.header = xstrdup(value); + ctx.cfg.header = strdup_first_line(value); else if (!strcmp(name, "logo")) - ctx.cfg.logo = xstrdup(value); + ctx.cfg.logo = strdup_first_line(value); else if (!strcmp(name, "logo-link")) - ctx.cfg.logo_link = xstrdup(value); + ctx.cfg.logo_link = strdup_first_line(value); else if (!strcmp(name, "module-link")) - ctx.cfg.module_link = xstrdup(value); + ctx.cfg.module_link = strdup_first_line(value); else if (!strcmp(name, "strict-export")) - ctx.cfg.strict_export = xstrdup(value); + ctx.cfg.strict_export = strdup_first_line(value); else if (!strcmp(name, "virtual-root")) ctx.cfg.virtual_root = ensure_end(value, '/'); else if (!strcmp(name, "noplainemail")) @@ -204,7 +206,7 @@ else if (!strcmp(name, "cache-size")) ctx.cfg.cache_size = atoi(value); else if (!strcmp(name, "cache-root")) - ctx.cfg.cache_root = xstrdup(expand_macros(value)); + ctx.cfg.cache_root = strdup_first_line(expand_macros(value)); else if (!strcmp(name, "cache-root-ttl")) ctx.cfg.cache_root_ttl = atoi(value); else if (!strcmp(name, "cache-repo-ttl")) @@ -248,21 +250,21 @@ } else if (!strcmp(name, "max-commit-count")) ctx.cfg.max_commit_count = atoi(value); else if (!strcmp(name, "project-list")) - ctx.cfg.project_list = xstrdup(expand_macros(value)); + ctx.cfg.project_list = strdup_first_line(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, repo_config); + ctx.cfg.project_list); else - scan_tree(expand_macros(value), repo_config); + scan_tree(expand_macros(value)); 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 = xstrdup(value); + ctx.cfg.repository_sort = strdup_first_line(value); else if (!strcmp(name, "section-sort")) ctx.cfg.section_sort = atoi(value); else if (!strcmp(name, "source-filter")) @@ -276,19 +278,19 @@ 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 = xstrdup(value); + ctx.cfg.agefile = strdup_first_line(value); else if (!strcmp(name, "mimetype-file")) - ctx.cfg.mimetype_file = xstrdup(value); + ctx.cfg.mimetype_file = strdup_first_line(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 = xstrdup(value); + ctx.cfg.robots = strdup_first_line(value); else if (!strcmp(name, "clone-prefix")) - ctx.cfg.clone_prefix = xstrdup(value); + ctx.cfg.clone_prefix = strdup_first_line(value); else if (!strcmp(name, "clone-url")) - ctx.cfg.clone_url = xstrdup(value); + ctx.cfg.clone_url = strdup_first_line(value); else if (!strcmp(name, "local-time")) ctx.cfg.local_time = atoi(value); else if (!strcmp(name, "commit-sort")) { @@ -784,15 +786,6 @@ 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; @@ -801,11 +794,8 @@ fprintf(f, "repo.path=%s\n", repo->path); if (repo->owner) fprintf(f, "repo.owner=%s\n", repo->owner); - if (repo->desc) { - char *tmp = get_first_line(repo->desc); - fprintf(f, "repo.desc=%s\n", tmp); - free(tmp); - } + if (repo->desc) + fprintf(f, "repo.desc=%s\n", repo->desc); for_each_string_list_item(item, &repo->readme) { if (item->util) fprintf(f, "repo.readme=%s:%s\n", (char *)item->util, item->string); @@ -828,6 +818,8 @@ 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", @@ -904,9 +896,9 @@ } idx = cgit_repolist.count; if (ctx.cfg.project_list) - scan_projects(path, ctx.cfg.project_list, repo_config); + scan_projects(path, ctx.cfg.project_list); else - scan_tree(path, repo_config); + scan_tree(path); print_repolist(f, &cgit_repolist, idx); if (rename(locked_rc.buf, cached_rc)) fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n", @@ -936,10 +928,9 @@ */ if (generate_cached_repolist(path, cached_rc.buf)) { if (ctx.cfg.project_list) - scan_projects(path, ctx.cfg.project_list, - repo_config); + scan_projects(path, ctx.cfg.project_list); else - scan_tree(path, repo_config); + scan_tree(path); } goto out; } @@ -1020,7 +1011,7 @@ */ ctx.cfg.snapshots = 0xFF; scan++; - scan_tree(arg, repo_config); + scan_tree(arg); } } if (scan) { @@ -1054,6 +1045,12 @@ 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; @@ -1061,6 +1058,7 @@ cgit_init_filters(); atexit(cgit_cleanup_filters); + set_die_routine(cgit_die_routine); prepare_context(); cgit_repolist.length = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/cgit.h new/cgit-1.3.1/cgit.h --- old/cgit-1.3/cgit.h 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/cgit.h 2026-05-04 23:03:51.000000000 +0200 @@ -101,6 +101,7 @@ int snapshots; int enable_blame; int enable_commit_graph; + int enable_follow_links; int enable_log_filecount; int enable_log_linecount; int enable_remote_branches; @@ -120,9 +121,6 @@ int ignore; }; -typedef void (*repo_config_fn)(struct cgit_repo *repo, const char *name, - const char *value); - struct cgit_repolist { int length; int count; @@ -333,7 +331,8 @@ extern char *cgit_default_repo_desc; extern struct cgit_repo *cgit_add_repo(const char *url); extern struct cgit_repo *cgit_get_repoinfo(const char *url); -extern void cgit_repo_config_cb(const char *name, const char *value); +extern void cgit_repo_config(struct cgit_repo *repo, const char *name, + const char *value); extern int chk_zero(int result, char *msg); extern int chk_positive(int result, char *msg); @@ -394,7 +393,9 @@ extern void cgit_prepare_repo_env(struct cgit_repo * repo); -extern int readfile(const char *path, char **buf, size_t *size); +extern int read_first_line(const char *path, char **buf, size_t *size); + +extern char *strdup_first_line(const char *txt); extern char *expand_macros(const char *txt); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/cgitrc.5.txt new/cgit-1.3.1/cgitrc.5.txt --- old/cgit-1.3/cgitrc.5.txt 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/cgitrc.5.txt 2026-05-04 23:03:51.000000000 +0200 @@ -503,6 +503,10 @@ A flag which can be used to disable the global setting `enable-commit-graph'. Default value: none. +repo.enable-follow-links:: + A flag which can be used to disable the global setting + `enable-follow-links'. Default value: none. + repo.enable-html-serving:: A flag which can be used to override the global setting `enable-html-serving`. Default value: none. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/filter.c new/cgit-1.3.1/filter.c --- old/cgit-1.3/filter.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/filter.c 2026-05-04 23:03:51.000000000 +0200 @@ -114,7 +114,7 @@ f = xmalloc(sizeof(*f)); /* We leave argv for now and assign it below. */ - cgit_exec_filter_init(f, xstrdup(cmd), NULL); + cgit_exec_filter_init(f, strdup_first_line(cmd), NULL); f->base.argument_count = argument_count; args_size = (2 + argument_count) * sizeof(char *); f->argv = xmalloc(args_size); @@ -356,7 +356,7 @@ filter->base.fprintfp = fprintf_lua_filter; filter->base.cleanup = cleanup_lua_filter; filter->base.argument_count = argument_count; - filter->script_file = xstrdup(cmd); + filter->script_file = strdup_first_line(cmd); return &filter->base; } @@ -402,7 +402,7 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) { - char *colon; + const char *colon; int i; size_t len; int argument_count; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/parsing.c new/cgit-1.3.1/parsing.c --- old/cgit-1.3/parsing.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/parsing.c 2026-05-04 23:03:51.000000000 +0200 @@ -19,7 +19,7 @@ */ void cgit_parse_url(const char *url) { - char *c, *cmd, *p; + char *c, *cmd, *p, *buf; struct cgit_repo *repo; if (!url || url[0] == '\0') @@ -32,11 +32,12 @@ return; } + buf = xstrdup(url); cmd = NULL; - c = strchr(url, '/'); + c = strchr(buf, '/'); while (c) { c[0] = '\0'; - repo = cgit_get_repoinfo(url); + repo = cgit_get_repoinfo(buf); if (repo) { ctx.repo = repo; cmd = c; @@ -56,6 +57,7 @@ if (cmd[1]) ctx.qry.page = xstrdup(cmd + 1); } + free(buf); } static char *substr(const char *head, const char *tail) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/scan-tree.c new/cgit-1.3.1/scan-tree.c --- old/cgit-1.3/scan-tree.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/scan-tree.c 2026-05-04 23:03:51.000000000 +0200 @@ -47,11 +47,10 @@ } static struct cgit_repo *repo; -static repo_config_fn config_fn; static void scan_tree_repo_config(const char *name, const char *value) { - config_fn(repo, name, value); + cgit_repo_config(repo, name, value); } static int gitconfig_config(const char *key, const char *value, @@ -60,15 +59,15 @@ const char *name; if (!strcmp(key, "gitweb.owner")) - config_fn(repo, "owner", value); + cgit_repo_config(repo, "owner", value); else if (!strcmp(key, "gitweb.description")) - config_fn(repo, "desc", value); + cgit_repo_config(repo, "desc", value); else if (!strcmp(key, "gitweb.category")) - config_fn(repo, "section", value); + cgit_repo_config(repo, "section", value); else if (!strcmp(key, "gitweb.homepage")) - config_fn(repo, "homepage", value); + cgit_repo_config(repo, "homepage", value); else if (skip_prefix(key, "cgit.", &name)) - config_fn(repo, name, value); + cgit_repo_config(repo, name, value); return 0; } @@ -80,7 +79,7 @@ return from < s ? NULL : from; } -static void add_repo(const char *base, struct strbuf *path, repo_config_fn fn) +static void add_repo(const char *base, struct strbuf *path) { struct stat st; struct passwd *pwd; @@ -122,7 +121,6 @@ strbuf_setlen(&rel, rel.len - 1); repo = cgit_add_repo(rel.buf); - config_fn = fn; if (ctx.cfg.enable_git_config) { strbuf_addstr(path, "config"); git_config_from_file(gitconfig_config, path->buf, NULL); @@ -135,7 +133,7 @@ strip_suffix_mem(repo->url, &urllen, "/"); repo->url[urllen] = '\0'; } - repo->path = xstrdup(path->buf); + repo->path = strdup_first_line(path->buf); while (!repo->owner) { if ((pwd = getpwuid(st.st_uid)) == NULL) { fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n", @@ -145,13 +143,13 @@ if (pwd->pw_gecos) if ((p = strchr(pwd->pw_gecos, ','))) *p = '\0'; - repo->owner = xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name); + repo->owner = strdup_first_line(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name); } if (repo->desc == cgit_default_repo_desc || !repo->desc) { strbuf_addstr(path, "description"); if (!stat(path->buf, &st)) - readfile(path->buf, &repo->desc, &size); + read_first_line(path->buf, &repo->desc, &size); strbuf_setlen(path, pathlen); } @@ -168,7 +166,7 @@ } if (slash && !n) { *slash = '\0'; - repo->section = xstrdup(rel.buf); + repo->section = strdup_first_line(rel.buf); *slash = '/'; if (starts_with(repo->name, repo->section)) { repo->name += strlen(repo->section); @@ -185,7 +183,7 @@ strbuf_release(&rel); } -static void scan_path(const char *base, const char *path, repo_config_fn fn) +static void scan_path(const char *base, const char *path) { DIR *dir = opendir(path); struct dirent *ent; @@ -201,12 +199,12 @@ strbuf_add(&pathbuf, path, strlen(path)); if (is_git_dir(pathbuf.buf)) { - add_repo(base, &pathbuf, fn); + add_repo(base, &pathbuf); goto end; } strbuf_addstr(&pathbuf, "/.git"); if (is_git_dir(pathbuf.buf)) { - add_repo(base, &pathbuf, fn); + add_repo(base, &pathbuf); goto end; } /* @@ -231,14 +229,14 @@ continue; } if (S_ISDIR(st.st_mode)) - scan_path(base, pathbuf.buf, fn); + scan_path(base, pathbuf.buf); } end: strbuf_release(&pathbuf); closedir(dir); } -void scan_projects(const char *path, const char *projectsfile, repo_config_fn fn) +void scan_projects(const char *path, const char *projectsfile) { struct strbuf line = STRBUF_INIT; FILE *projects; @@ -255,7 +253,7 @@ continue; strbuf_insert(&line, 0, "/", 1); strbuf_insert(&line, 0, path, strlen(path)); - scan_path(path, line.buf, fn); + scan_path(path, line.buf); } if ((err = ferror(projects))) { fprintf(stderr, "Error reading from projectsfile %s: %s (%d)\n", @@ -265,7 +263,7 @@ strbuf_release(&line); } -void scan_tree(const char *path, repo_config_fn fn) +void scan_tree(const char *path) { - scan_path(path, path, fn); + scan_path(path, path); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/scan-tree.h new/cgit-1.3.1/scan-tree.h --- old/cgit-1.3/scan-tree.h 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/scan-tree.h 2026-05-04 23:03:51.000000000 +0200 @@ -1,2 +1,2 @@ -extern void scan_projects(const char *path, const char *projectsfile, repo_config_fn fn); -extern void scan_tree(const char *path, repo_config_fn fn); +extern void scan_projects(const char *path, const char *projectsfile); +extern void scan_tree(const char *path); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/shared.c new/cgit-1.3.1/shared.c --- old/cgit-1.3/shared.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/shared.c 2026-05-04 23:03:51.000000000 +0200 @@ -52,6 +52,7 @@ ret = &cgit_repolist.repos[cgit_repolist.count-1]; memset(ret, 0, sizeof(struct cgit_repo)); ret->url = trim_end(url, '/'); + *strchrnul(ret->url, '\n') = '\0'; ret->name = ret->url; ret->path = NULL; ret->desc = cgit_default_repo_desc; @@ -62,6 +63,7 @@ ret->snapshots = ctx.cfg.snapshots; ret->enable_blame = ctx.cfg.enable_blame; ret->enable_commit_graph = ctx.cfg.enable_commit_graph; + ret->enable_follow_links = ctx.cfg.enable_follow_links; ret->enable_log_filecount = ctx.cfg.enable_log_filecount; ret->enable_log_linecount = ctx.cfg.enable_log_linecount; ret->enable_remote_branches = ctx.cfg.enable_remote_branches; @@ -439,9 +441,10 @@ } /* Read the content of the specified file into a newly allocated buffer, - * zeroterminate the buffer and return 0 on success, errno otherwise. + * zeroterminate the buffer, truncate at a new line, and return 0 on success, + * errno otherwise. */ -int readfile(const char *path, char **buf, size_t *size) +int read_first_line(const char *path, char **buf, size_t *size) { int fd, e; struct stat st; @@ -462,10 +465,18 @@ *size = read_in_full(fd, *buf, st.st_size); e = errno; (*buf)[*size] = '\0'; + *strchrnul(*buf, '\n') = '\0'; close(fd); return (*size == st.st_size ? 0 : e); } +char *strdup_first_line(const char *txt) +{ + char *t = xstrdup(txt); + *strchrnul(t, '\n') = '\0'; + return t; +} + static int is_token_char(char c) { return isalnum(c) || c == '_'; @@ -540,7 +551,8 @@ char *get_mimetype_for_filename(const char *filename) { - char *ext, *mimetype, line[1024]; + const char *ext; + char *mimetype, line[1024]; struct string_list list = STRING_LIST_INIT_NODUP; int i; FILE *file; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-blame.c new/cgit-1.3.1/ui-blame.c --- old/cgit-1.3/ui-blame.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-blame.c 2026-05-04 23:03:51.000000000 +0200 @@ -263,7 +263,7 @@ static int basedir_len(const char *path) { - char *p = strrchr(path, '/'); + const char *p = strrchr(path, '/'); if (p) return p - path + 1; return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-clone.c new/cgit-1.3.1/ui-clone.c --- old/cgit-1.3/ui-clone.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-clone.c 2026-05-04 23:03:51.000000000 +0200 @@ -33,22 +33,26 @@ static void print_pack_info(void) { - struct packfile_list_entry *e; + struct odb_source *source; char *offset; ctx.page.mimetype = "text/plain"; ctx.page.filename = "objects/info/packs"; cgit_print_http_headers(); odb_reprepare(the_repository->objects); - for (e = packfile_store_get_packs(the_repository->objects->sources->packfiles); e; e = e->next) { - struct packed_git *p = e->pack; - if (p->pack_local) { - offset = strrchr(p->pack_name, '/'); - if (offset && offset[1] != '\0') - ++offset; - else - offset = p->pack_name; - htmlf("P %s\n", offset); + for (source = the_repository->objects->sources; source; source = source->next) { + struct odb_source_files *files = odb_source_files_downcast(source); + struct packfile_list_entry *e; + for (e = files->packed->packs.head; e; e = e->next) { + struct packed_git *p = e->pack; + if (p->pack_local) { + offset = strrchr(p->pack_name, '/'); + if (offset && offset[1] != '\0') + ++offset; + else + offset = p->pack_name; + htmlf("P %s\n", offset); + } } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-diff.c new/cgit-1.3.1/ui-diff.c --- old/cgit-1.3/ui-diff.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-diff.c 2026-05-04 23:03:51.000000000 +0200 @@ -395,7 +395,7 @@ * entire commit to detect renames so we must limit the paths in our * own callbacks and not pass the prefix to the diff machinery. */ - if (ctx.qry.follow && ctx.cfg.enable_follow_links) { + if (ctx.qry.follow && ctx.repo->enable_follow_links) { current_prefix = prefix; prefix = ""; } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-log.c new/cgit-1.3.1/ui-log.c --- old/cgit-1.3/ui-log.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-log.c 2026-05-04 23:03:51.000000000 +0200 @@ -407,7 +407,7 @@ } } - if (!path || !ctx.cfg.enable_follow_links) { + if (!path || !ctx.repo->enable_follow_links) { /* * If we don't have a path, "follow" is a no-op so make sure * the variable is set to false to avoid needing to check diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-plain.c new/cgit-1.3.1/ui-plain.c --- old/cgit-1.3/ui-plain.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-plain.c 2026-05-04 23:03:51.000000000 +0200 @@ -157,7 +157,7 @@ static int basedir_len(const char *path) { - char *p = strrchr(path, '/'); + const char *p = strrchr(path, '/'); if (p) return p - path + 1; return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-repolist.c new/cgit-1.3.1/ui-repolist.c --- old/cgit-1.3/ui-repolist.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-repolist.c 2026-05-04 23:03:51.000000000 +0200 @@ -18,7 +18,7 @@ char *buf = NULL; struct strbuf date_buf = STRBUF_INIT; - if (readfile(path, &buf, &size)) { + if (read_first_line(path, &buf, &size)) { free(buf); return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-shared.c new/cgit-1.3.1/ui-shared.c --- old/cgit-1.3/ui-shared.c 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-shared.c 2026-05-04 23:03:51.000000000 +0200 @@ -889,13 +889,18 @@ void cgit_print_error_page(int code, const char *msg, const char *fmt, ...) { va_list ap; + va_start(ap, fmt); + cgit_vprint_error_page(code, msg, fmt, ap); + va_end(ap); +} + +void cgit_vprint_error_page(int code, const char *msg, const char *fmt, va_list ap) +{ ctx.page.expires = ctx.cfg.cache_dynamic_ttl; ctx.page.status = code; ctx.page.statusmsg = msg; cgit_print_layout_start(); - va_start(ap, fmt); cgit_vprint_error(fmt, ap); - va_end(ap); cgit_print_layout_end(); } @@ -1153,7 +1158,7 @@ html("<div class='path'>"); html("path: "); cgit_print_path_crumbs(ctx.qry.vpath); - if (ctx.cfg.enable_follow_links && !strcmp(ctx.qry.page, "log")) { + if (ctx.repo->enable_follow_links && !strcmp(ctx.qry.page, "log")) { html(" ("); ctx.qry.follow = !ctx.qry.follow; cgit_self_link(ctx.qry.follow ? "follow" : "unfollow", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cgit-1.3/ui-shared.h new/cgit-1.3.1/ui-shared.h --- old/cgit-1.3/ui-shared.h 2026-02-24 02:44:41.000000000 +0100 +++ new/cgit-1.3.1/ui-shared.h 2026-05-04 23:03:51.000000000 +0200 @@ -73,6 +73,7 @@ extern void cgit_print_docend(void); __attribute__((format (printf,3,4))) extern void cgit_print_error_page(int code, const char *msg, const char *fmt, ...); +extern void cgit_vprint_error_page(int code, const char *msg, const char *fmt, va_list ap); extern void cgit_print_pageheader(void); extern void cgit_print_filemode(unsigned short mode); extern void cgit_compose_snapshot_prefix(struct strbuf *filename, ++++++ git-2.53.0.tar.xz -> git-2.54.0.tar.xz ++++++ /work/SRC/openSUSE:Factory/cgit/git-2.53.0.tar.xz /work/SRC/openSUSE:Factory/.cgit.new.1981/git-2.54.0.tar.xz differ: char 15, line 1
