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

Reply via email to