Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gitolite for openSUSE:Factory checked in at 2026-09-14 16:21:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gitolite (Old) and /work/SRC/openSUSE:Factory/.gitolite.new.1265 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gitolite" Mon Sep 14 16:21:21 2026 rev:15 rq:1377643 version:3.6.15 Changes: -------- --- /work/SRC/openSUSE:Factory/gitolite/gitolite.changes 2026-03-18 16:51:32.567636532 +0100 +++ /work/SRC/openSUSE:Factory/.gitolite.new.1265/gitolite.changes 2026-09-14 16:21:23.059052754 +0200 @@ -1,0 +2,7 @@ +Sun Sep 13 08:16:57 UTC 2026 - Martin Pluskal <[email protected]> + +- update to 3.6.15: + * allow passing permission and ref to stdin using `access` + in batch mode + +------------------------------------------------------------------- Old: ---- gitolite-3.6.14.tar.gz New: ---- gitolite-3.6.15.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gitolite.spec ++++++ --- /var/tmp/diff_new_pack.BuKtA0/_old 2026-09-14 16:21:24.678120789 +0200 +++ /var/tmp/diff_new_pack.BuKtA0/_new 2026-09-14 16:21:24.680120873 +0200 @@ -19,25 +19,24 @@ %define gitolite_homedir /srv/gitolite %define git_user git Name: gitolite -Version: 3.6.14 +Version: 3.6.15 Release: 0 Summary: Server for git directory version tracker License: GPL-2.0-or-later -Group: Development/Tools/Version Control -URL: http://gitolite.com +URL: https://gitolite.com Source0: https://github.com/sitaramc/%{name}/archive/v%{version}/%{name}-%{version}.tar.gz Source11: README.SUSE -Provides: group(%{git_user}) -Provides: user(%{git_user}) BuildRequires: git Requires: git Conflicts: gitosis +Provides: group(%{git_user}) +Provides: user(%{git_user}) BuildArch: noarch +%{perl_requires} %if 0%{?suse_version} >= 1330 -Requires(pre): user(wwwrun) Requires(pre): user(nginx) +Requires(pre): user(wwwrun) %endif -%{perl_requires} %description Gitolite is an access control layer on top of git, which allows access control ++++++ gitolite-3.6.14.tar.gz -> gitolite-3.6.15.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/CHANGELOG new/gitolite-3.6.15/CHANGELOG --- old/gitolite-3.6.14/CHANGELOG 2025-07-18 10:44:16.000000000 +0200 +++ new/gitolite-3.6.15/CHANGELOG 2026-08-08 11:23:35.000000000 +0200 @@ -1,3 +1,9 @@ +2026-08-08 v3.6.15 only one major change: + + allow passing permission and ref to stdin using `access` in batch mode + (brief text added to `gitolite access --help`; more details in + src/commands/access script) + 2025-07-18 v3.6.14 only one important fix: detect HEAD name in admin repo (don't require it be "master") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/src/commands/access new/gitolite-3.6.15/src/commands/access --- old/gitolite-3.6.14/src/commands/access 2025-07-18 10:44:16.000000000 +0200 +++ new/gitolite-3.6.15/src/commands/access 2026-08-08 11:23:35.000000000 +0200 @@ -9,6 +9,20 @@ our ( $q, $s, $h ); # quiet, show, help +$|++; # useful when STDOUT is a pipe +# Additional documentation on the pipe mode. +# 1. "access" always had a pipe mode, but only for repo and user, not the +# "perm" and "ref" fields +# 2. What this enhancement does is allow all 4 fields to be sent in from +# STDIN. +# 3. The new "t/accesspipe.t" test script exercises both the 3-argument +# (repo, user, perm; with ref left as "any") and the 4-argument modes. +# 4. One big caveat about using a possibly long-lived "gitolite access" +# command serving responses like this is that if the access rules change, +# access may not pick up the changes. If you're doing this you will need +# to have a way to restart your script every time gitolite-admin gets +# pushed, or a new wild repo is created, to be safe. + =for usage Usage: gitolite access [-q|-s] <repo> <user> <perm> <ref> @@ -22,22 +36,26 @@ - ref: defauts to 'any'. See notes below Notes: - - ref: something like 'master', or 'refs/tags/v1.0', or even a VREF if you +- ref: something like 'master', or 'refs/tags/v1.0', or even a VREF if you know what they look like. The 'any' ref is special -- it ignores deny rules, thus simulating gitolite's behaviour during the pre-git access check (see 'deny-rules' section in rules.html for details). - - batch mode: see src/triggers/post-compile/update-git-daemon-access-list +- batch mode: see src/triggers/post-compile/update-git-daemon-access-list for a good example that shows how to test several repos in one invocation. This is orders of magnitude faster than running the command multiple times; you'll notice if you have more than a hundred or so repos. - - '-s' shows the rules (conf file name, line number, and rule) that were + - update on batch mode, v3.6.15: batch mode now allows all 4 parameters + to be sent in via STDIN, but please see source (src/commands/access) + for more details and caveats. + +- '-s' shows the rules (conf file name, line number, and rule) that were considered and how they fared. - - you can also test the ability to create wild repos if you set GL_USER to +- you can also test the ability to create wild repos if you set GL_USER to the username and use ^C as the permission to check for. =cut @@ -49,13 +67,16 @@ # default ref is 'any' $ref ||= 'any'; # fq the ref if needed -$ref =~ s(^)(refs/heads/) if $ref and $ref ne 'any' and $ref !~ m(^(refs|VREF)/); -_die "invalid perm" if not( $aa and $aa =~ /^(R|W|\+|C|D|M|\^C)$/ ); -_die "invalid ref name" if not( $ref and $ref =~ $REF_OR_FILENAME_PATT ); +if (not $ref eq '%') { + $ref = checkref( $ref ); +} +if (not $aa eq '%') { + _die "invalid perm" if not( $aa and $aa =~ /^(R|W|\+|C|D|M|\^C)$/ ); +} my $ret = ''; -if ( $repo ne '%' and $user ne '%' ) { +if ( $repo ne '%' and $user ne '%' and $aa ne '%' and $ref ne '%' ) { # single repo, single user; no STDIN $ret = access( $repo, $user, adjust_aa($repo, $aa), $ref ); @@ -75,6 +96,8 @@ $repo = '' if $repo eq '%'; $user = '' if $user eq '%'; +$aa = '' if $aa eq '%'; +$ref = '' if $ref eq '%'; _die "'-q' and '-s' meaningless in pipe mode" if $q or $s; @ARGV = (); @@ -82,8 +105,14 @@ my @in = split; my $r = $repo || shift @in; my $u = $user || shift @in; - $ret = access( $r, $u, adjust_aa($r, $aa), $ref ); - print "$r\t$u\t$ret\n"; + my $a = $aa || shift @in; + my $rf = $ref || checkref( shift @in ); + $ret = access( $r, $u, adjust_aa($r, $a), $rf ); + if ( $aa and $ref ) { + print "$r\t$u\t$ret\n"; + } else { + print "$r\t$u\t$a\t$rf\t$ret\n"; + } } sub adjust_aa { @@ -94,6 +123,13 @@ return $aa; } +sub checkref { + my $ref = shift; + $ref =~ s(^)(refs/heads/) if $ref and $ref ne 'any' and $ref !~ m(^(refs|VREF)/); + _die "invalid ref name" if not( $ref and $ref =~ $REF_OR_FILENAME_PATT ); + return $ref +} + sub show { my $ret = shift; die "repo already exists; ^C won't work\n" if $ret =~ /DENIED by existence/; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/src/gitolite new/gitolite-3.6.15/src/gitolite --- old/gitolite-3.6.14/src/gitolite 2025-07-18 10:44:16.000000000 +0200 +++ new/gitolite-3.6.15/src/gitolite 2026-08-08 11:23:35.000000000 +0200 @@ -21,14 +21,9 @@ list-memberships list all groups a name is a member of list-members list all members of a group -Warnings: - - list-users is disk bound and could take a while on sites with 1000s of repos - - list-memberships does not check if the name is known; unknown names come - back with 2 answers: the name itself and '@all' - In addition, running 'gitolite help' should give you a list of custom commands available. They may or may not respond to '-h', depending on how they were -written. +written, but it's worth a try, at least the first time you use a command. =cut # ---------------------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/src/lib/Gitolite/Hooks/Update.pm new/gitolite-3.6.15/src/lib/Gitolite/Hooks/Update.pm --- old/gitolite-3.6.14/src/lib/Gitolite/Hooks/Update.pm 2025-07-18 10:44:16.000000000 +0200 +++ new/gitolite-3.6.15/src/lib/Gitolite/Hooks/Update.pm 2026-08-08 11:23:35.000000000 +0200 @@ -115,25 +115,33 @@ my ( $ref, $oldsha, $newsha ) = @_; my ( $oldtree, $newtree, $aa ); + my $sha256 = 0; + my $zeroes = '0' x 40; # this is special to git -- the hash of an empty tree my $empty = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'; - $oldtree = $oldsha eq '0' x 40 ? $empty : $oldsha; - $newtree = $newsha eq '0' x 40 ? $empty : $newsha; + if (length($oldsha) == 64) { + $sha256 = 1; + $zeroes = '0' x 64; + $empty = '6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321'; + } - my $merge_base = '0' x 40; + $oldtree = $oldsha eq $zeroes ? $empty : $oldsha; + $newtree = $newsha eq $zeroes ? $empty : $newsha; + + my $merge_base = $zeroes; # for branch create or delete, merge_base stays at '0'x40 chomp( $merge_base = `git merge-base $oldsha $newsha` ) - unless $oldsha eq '0' x 40 - or $newsha eq '0' x 40; + unless $oldsha eq $zeroes + or $newsha eq $zeroes; $aa = 'W'; # tag rewrite - $aa = '+' if $ref =~ m(refs/tags/) and $oldsha ne ( '0' x 40 ); + $aa = '+' if $ref =~ m(refs/tags/) and $oldsha ne ( $zeroes ); # non-ff push to ref (including ref delete) $aa = '+' if $oldsha ne $merge_base; - $aa = 'D' if ( option( $ENV{GL_REPO}, 'DELETE_IS_D' ) ) and $newsha eq '0' x 40; - $aa = 'C' if ( option( $ENV{GL_REPO}, 'CREATE_IS_C' ) ) and $oldsha eq '0' x 40; + $aa = 'D' if ( option( $ENV{GL_REPO}, 'DELETE_IS_D' ) ) and $newsha eq $zeroes; + $aa = 'C' if ( option( $ENV{GL_REPO}, 'CREATE_IS_C' ) ) and $oldsha eq $zeroes; # and now "M" commits. All the other accesses (W, +, C, D) were mutually # exclusive in some sense. Sure a W could be a C or a + could be a D but @@ -144,7 +152,7 @@ # effect and this push contains a merge inside) if ( option( $ENV{GL_REPO}, 'MERGE_CHECK' ) ) { - if ( $oldsha eq '0' x 40 or $newsha eq '0' x 40 ) { + if ( $oldsha eq $zeroes or $newsha eq $zeroes ) { _warn "ref create/delete ignored for purposes of merge-check\n"; } else { $aa .= 'M' if `git rev-list -n 1 --merges $oldsha..$newsha` =~ /./; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/t/access.t new/gitolite-3.6.15/t/access.t --- old/gitolite-3.6.14/t/access.t 2025-07-18 10:44:16.000000000 +0200 +++ new/gitolite-3.6.15/t/access.t 2026-08-08 11:23:35.000000000 +0200 @@ -215,7 +215,7 @@ '; -try "ADMIN_PUSH set4; !/FATAL/" or die text(); +try "ADMIN_PUSH set5; !/FATAL/" or die text(); try " gitolite access foo u1 +; !ok diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/t/accesspipe-prep.t new/gitolite-3.6.15/t/accesspipe-prep.t --- old/gitolite-3.6.14/t/accesspipe-prep.t 1970-01-01 01:00:00.000000000 +0100 +++ new/gitolite-3.6.15/t/accesspipe-prep.t 2026-08-08 11:23:35.000000000 +0200 @@ -0,0 +1,81 @@ +#!/usr/bin/perl +use strict; +use warnings; + +# this is hardcoded; change it if needed +use lib "src/lib"; +use Gitolite::Test; + +# test 'gitolite access' +# ---------------------------------------------------------------------- + +try "plan 32"; + +confreset;confadd ' + @admins = admin dev1 + repo gitolite-admin + RW+ = admin + + @g1 = u1 + @g2 = u2 + @g3 = u3 + @gaa = aa + repo @gaa + RW+ = @g1 + RW = @g2 + RW+ master = @g3 + RW master = u4 + - master = u5 + RW+ dev = u5 + RW = u5 +'; + +try "ADMIN_PUSH set2; !/FATAL/" or die text(); + +confadd ' + @admins = admin dev1 + repo gitolite-admin + RW+ = admin + + @gr1 = r1 + repo @gr1 + RW refs/heads/v[0-9] = u1 + RW refs/heads = tester + + @gr2 = r2 + repo @gr2 + RW refs/heads/v[0-9] = u1 + - refs/heads/v[0-9] = tester + RW refs/heads = tester +'; + +try "ADMIN_PUSH set3; !/FATAL/" or die text(); + +confadd ' + repo @all + R = gitweb + + repo c0 + RW+ = @all + repo c1 + RWC = u1 + RW+ = @all +'; + +try "ADMIN_PUSH set4; !/FATAL/" or die text(); + +confadd ' + repo foo + R = u1 + RW = u2 + RW+ = u3 + + repo bar + R = u1 + RW = u2 + RW+ = u3 + RW+CDM = u6 + +'; + +try "ADMIN_PUSH set5; !/FATAL/" or die text(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/t/accesspipe.in1 new/gitolite-3.6.15/t/accesspipe.in1 --- old/gitolite-3.6.14/t/accesspipe.in1 1970-01-01 01:00:00.000000000 +0100 +++ new/gitolite-3.6.15/t/accesspipe.in1 2026-08-08 11:23:35.000000000 +0200 @@ -0,0 +1,39 @@ +@gaa @g1 + any +aa @g1 + refs/heads/master +@gaa @g1 + refs/heads/next +@gaa @g1 W refs/heads/next +@gaa u1 + refs/heads/dev +@gaa u1 + refs/heads/next +aa u1 W refs/heads/next +@gaa @g2 + refs/heads/master +@gaa @g2 + refs/heads/next +aa @g2 W refs/heads/master +aa u2 + any +@gaa u2 + refs/heads/master +@gaa u2 W refs/heads/master +@gaa @g3 + refs/heads/master +@gaa @g3 W refs/heads/next +@gaa @g3 W refs/heads/dev +aa u3 + refs/heads/dev +aa u3 + refs/heads/next +@gaa u4 + refs/heads/master +@gaa u4 W refs/heads/master +aa u4 + refs/heads/next +@gaa u4 W refs/heads/next +@gaa u5 R any +aa u5 R any +@gaa u5 + refs/heads/dev +@gaa u5 + refs/heads/master +aa u5 + refs/heads/next +@gaa u5 R refs/heads/dev +@gaa u5 R refs/heads/master +@gaa u5 R refs/heads/next +aa u5 W refs/heads/dev +aa u5 W refs/heads/master +@gaa u5 W refs/heads/next + +@gr2 tester W refs/heads/v1 +@gr1 tester W refs/heads/v1 +r1 tester W refs/heads/v1 +r2 tester W refs/heads/v1 +r2 tester W refs/heads/va diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/t/accesspipe.in2 new/gitolite-3.6.15/t/accesspipe.in2 --- old/gitolite-3.6.14/t/accesspipe.in2 1970-01-01 01:00:00.000000000 +0100 +++ new/gitolite-3.6.15/t/accesspipe.in2 2026-08-08 11:23:35.000000000 +0200 @@ -0,0 +1,41 @@ +c0 u1 + +c0 u1 C +c0 u2 + +c0 u2 C +c1 u1 + +c1 u1 C +c1 u2 + +c1 u2 C + +foo u1 + +foo u2 + +foo u3 + +foo u1 C +foo u2 C +foo u3 C +foo u1 D +foo u2 D +foo u3 D +foo u1 M +foo u2 M +foo u3 M + +bar u1 + +bar u2 + +bar u3 + +bar u1 C +bar u2 C +bar u3 C +bar u1 D +bar u2 D +bar u3 D +bar u1 M +bar u2 M +bar u3 M + +bar u6 R +bar u6 W +bar u6 + +bar u6 C +bar u6 D +bar u6 M diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/t/accesspipe.ref new/gitolite-3.6.15/t/accesspipe.ref --- old/gitolite-3.6.14/t/accesspipe.ref 1970-01-01 01:00:00.000000000 +0100 +++ new/gitolite-3.6.15/t/accesspipe.ref 2026-08-08 11:23:35.000000000 +0200 @@ -0,0 +1,76 @@ +@gaa @g1 + any refs/.* +aa @g1 + refs/heads/master refs/.* +@gaa @g1 + refs/heads/next refs/.* +@gaa @g1 W refs/heads/next refs/.* +@gaa u1 + refs/heads/dev refs/.* +@gaa u1 + refs/heads/next refs/.* +aa u1 W refs/heads/next refs/.* +@gaa @g2 + refs/heads/master + refs/heads/master @gaa @g2 DENIED by fallthru +@gaa @g2 + refs/heads/next + refs/heads/next @gaa @g2 DENIED by fallthru +aa @g2 W refs/heads/master refs/.* +aa u2 + any + any aa u2 DENIED by fallthru +@gaa u2 + refs/heads/master + refs/heads/master @gaa u2 DENIED by fallthru +@gaa u2 W refs/heads/master refs/.* +@gaa @g3 + refs/heads/master refs/heads/master +@gaa @g3 W refs/heads/next W refs/heads/next @gaa @g3 DENIED by fallthru +@gaa @g3 W refs/heads/dev W refs/heads/dev @gaa @g3 DENIED by fallthru +aa u3 + refs/heads/dev + refs/heads/dev aa u3 DENIED by fallthru +aa u3 + refs/heads/next + refs/heads/next aa u3 DENIED by fallthru +@gaa u4 + refs/heads/master + refs/heads/master @gaa u4 DENIED by fallthru +@gaa u4 W refs/heads/master refs/heads/master +aa u4 + refs/heads/next + refs/heads/next aa u4 DENIED by fallthru +@gaa u4 W refs/heads/next W refs/heads/next @gaa u4 DENIED by fallthru +@gaa u5 R any refs/heads/dev +aa u5 R any refs/heads/dev +@gaa u5 + refs/heads/dev refs/heads/dev +@gaa u5 + refs/heads/master + refs/heads/master @gaa u5 DENIED by refs/heads/master +aa u5 + refs/heads/next + refs/heads/next aa u5 DENIED by fallthru +@gaa u5 R refs/heads/dev refs/heads/dev +@gaa u5 R refs/heads/master R refs/heads/master @gaa u5 DENIED by refs/heads/master +@gaa u5 R refs/heads/next refs/.* +aa u5 W refs/heads/dev refs/heads/dev +aa u5 W refs/heads/master W refs/heads/master aa u5 DENIED by refs/heads/master +@gaa u5 W refs/heads/next refs/.* +@gr2 tester W refs/heads/v1 W refs/heads/v1 @gr2 tester DENIED by refs/heads/v[0-9] +@gr1 tester W refs/heads/v1 refs/heads +r1 tester W refs/heads/v1 refs/heads +r2 tester W refs/heads/v1 W refs/heads/v1 r2 tester DENIED by refs/heads/v[0-9] +r2 tester W refs/heads/va refs/heads +c0 u1 + any refs/.* +c0 u1 C any refs/.* +c0 u2 + any refs/.* +c0 u2 C any refs/.* +c1 u1 + any refs/.* +c1 u1 C any refs/.* +c1 u2 + any refs/.* +c1 u2 C any C any c1 u2 DENIED by fallthru +foo u1 + any + any foo u1 DENIED by fallthru +foo u2 + any + any foo u2 DENIED by fallthru +foo u3 + any refs/.* +foo u1 C any W any foo u1 DENIED by fallthru +foo u2 C any refs/.* +foo u3 C any refs/.* +foo u1 D any + any foo u1 DENIED by fallthru +foo u2 D any + any foo u2 DENIED by fallthru +foo u3 D any refs/.* +foo u1 M any W any foo u1 DENIED by fallthru +foo u2 M any refs/.* +foo u3 M any refs/.* +bar u1 + any + any bar u1 DENIED by fallthru +bar u2 + any + any bar u2 DENIED by fallthru +bar u3 + any refs/.* +bar u1 C any C any bar u1 DENIED by fallthru +bar u2 C any C any bar u2 DENIED by fallthru +bar u3 C any C any bar u3 DENIED by fallthru +bar u1 D any D any bar u1 DENIED by fallthru +bar u2 D any D any bar u2 DENIED by fallthru +bar u3 D any D any bar u3 DENIED by fallthru +bar u1 M any M any bar u1 DENIED by fallthru +bar u2 M any M any bar u2 DENIED by fallthru +bar u3 M any M any bar u3 DENIED by fallthru +bar u6 R any refs/.* +bar u6 W any refs/.* +bar u6 + any refs/.* +bar u6 C any refs/.* +bar u6 D any refs/.* +bar u6 M any refs/.* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/t/accesspipe.t new/gitolite-3.6.15/t/accesspipe.t --- old/gitolite-3.6.14/t/accesspipe.t 1970-01-01 01:00:00.000000000 +0100 +++ new/gitolite-3.6.15/t/accesspipe.t 2026-08-08 11:23:35.000000000 +0200 @@ -0,0 +1,48 @@ +#!/bin/bash + +# this needs to be run right after t/access.t because we're using the conf +# used in the last step of that test. + +# ---------------------------------------------------------------------- +# setup the reference output + +# ---------------------------------------------------------------------- +# print plan + +echo 1..76 + +# ---------------------------------------------------------------------- +# run the test + +count=0 + +pipein() { + cat $1 | while read i; do + [[ -n "$i" ]] || continue + echo "$i" + sleep 0.05 + done | gitolite access % % % $2 | while read o; do + echo "$o" + done | while read result; do + (( count += 1 )) + ref=$(sed -ne $count"p" < t/accesspipe.ref) + if test "$result" = "$ref"; then + echo "ok ($count)" + else + echo "not ok ($count)" + # echo "expected: $ref" >&2 + # echo " actual: $result" >&2 + # echo >&2 + fi + done +} + +# the 4-arguments-per-line-of-STDIN mode first +pipein t/accesspipe.in1 % + +# the updated counter is deep inside a loop, and we want both the "in1" and +# "in2" to look like one seamless input. +count=38 + +# now the 3-arguments-per-line mode +pipein t/accesspipe.in2 any diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gitolite-3.6.14/t/basic.t new/gitolite-3.6.15/t/basic.t --- old/gitolite-3.6.14/t/basic.t 2025-07-18 10:44:16.000000000 +0200 +++ new/gitolite-3.6.15/t/basic.t 2026-08-08 11:23:35.000000000 +0200 @@ -211,7 +211,7 @@ PUSH u5 +foo^:foo !ok; gsh reject - /remote: FATAL: \\+ refs/heads/foo aa u5 DENIED by fallthru/ + /FATAL: \\+ refs/heads/foo aa u5 DENIED by fallthru/ # u5 push foo ok git checkout foo
