commit:     531c986e9474c13dc5b7f0ac93af92dbe6760470
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Fri Sep 16 23:24:43 2022 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Fri Sep 16 23:25:27 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=531c986e

dev-vcs/git: add 2.38.0_rc0

Signed-off-by: Sam James <sam <AT> gentoo.org>

 dev-vcs/git/Manifest                               |   3 +
 .../git/{git-9999.ebuild => git-2.38.0_rc0.ebuild} | 445 +++++++++++----------
 dev-vcs/git/git-9999-r1.ebuild                     | 445 +++++++++++----------
 dev-vcs/git/git-9999-r2.ebuild                     | 445 +++++++++++----------
 dev-vcs/git/git-9999-r3.ebuild                     | 445 +++++++++++----------
 dev-vcs/git/git-9999.ebuild                        | 445 +++++++++++----------
 6 files changed, 1158 insertions(+), 1070 deletions(-)

diff --git a/dev-vcs/git/Manifest b/dev-vcs/git/Manifest
index 1dd56125f2d3..d173cc94774e 100644
--- a/dev-vcs/git/Manifest
+++ b/dev-vcs/git/Manifest
@@ -1,6 +1,9 @@
 DIST git-2.35.1.tar.xz 6874520 BLAKE2B 
028ff97b47748871da145720d0d258a0dcf4acc60b10c787dee5703fcab5f6e621c5671ee9e7a25009e82a2830400f35fa232d88c62606a6687260c744680025
 SHA512 
926c6813ef61931e1a1c43dfd7b15e20dc5878c1752876bd08f039249c9ed09f20f096b2f01947de9c9522c942e9fa8c1363d7d31a488bbe3f93c0cff31fcbcb
 DIST git-2.37.3.tar.xz 6987464 BLAKE2B 
b672ed0a99532b2e2e69babbea9155e39f05590a76f55791ffed6ce4ef8b68d8e306a0a23819af26f34fcf3d16211c3a10ec58d86d81262f7a1261d0e51b1305
 SHA512 
9120050b01d8ac8d9f9e85f19cb84dc90c28f3beadc3ea94da94845f2eb5e35aa83eee8447a7ecef5190b8eb5d01be621be2e82bb3020e51e05037cd1fa9b58f
+DIST git-2.38.0.rc0.tar.xz 7042460 BLAKE2B 
788a03900b42a9e7326ced66c3b0c6b705ca7808fbfa1f05eb692b61215113157035353ad9754f2d37cd8f4d69a30d5147b025b49449ef6a8902274a249f785d
 SHA512 
98b5aa08da0a754d3d6119b4690e2add3f85295ba5243f8cbfef04738c27ab1d39c3388e27349a824841f4b54004e22e8731f5aa37afa5f62b2b2a197b8ec84a
 DIST git-htmldocs-2.35.1.tar.xz 1410148 BLAKE2B 
68c3d12341271b861f42135bd4bd6e68ebcc6466931d383378b49aac42f77187f3fadc237974349cb0b50e4c5fb7a8ab185114341dd3012d159e420405d9ef91
 SHA512 
52a40644a7cd38caddecc43182863ca2f456644fff918ed4c8f826cbf269352c73d6bdc9119d25fcf537bc2fa38750791013329e4b0e32c8d14f0769dab85804
 DIST git-htmldocs-2.37.3.tar.xz 1447620 BLAKE2B 
4efb86fb5431fd96ec4bcad7ecd9d5ae1d3f81f57f17dab4d8343948758f66b549b2442330b20cdb4ecd96f2029f4e7a376de5561fd9eda70acc46d2cffd7090
 SHA512 
ecc483a1fecf8c056a57e14a59950dc8a00f7940453dd5e2ccfd8dab966a9fee47178a7bbf8988e2c9a67ea6d84ffc33be790c49f812fb0ba661b57b7ff7b6ef
+DIST git-htmldocs-2.38.0.rc0.tar.xz 1473440 BLAKE2B 
5b0b22b5ab8da9e5dcae0bfd87d1f9b62a1e6dfd36685d471800de5dd306efa10e047586d045a993695f770a36e780c211651c1c1f5dd1f6c22c2d0a93e4e00d
 SHA512 
4cbf0cec1d86232bfcd816f8e6a0fa25db4e0a1e34db3876a622072403d2c6649a37a26c1a43fe22a45c1986ca43e140deefd888b345090056aa246b0796b2b0
 DIST git-manpages-2.35.1.tar.xz 497284 BLAKE2B 
2d0d633320982243316575cc278df6c6a9ef181bf45ea9c1c8288e2677e4e71a33af96bada9bd90b03310be7dd33f2762b6b95489e267e2c191dcc7d1a715fe7
 SHA512 
0f4c46880f0e6d493112dcd4753fbe3702c06aa68be09bcbfc90263a355deba080995a08916b1f2404e4e17d720ee0de46a55e450c6cabeb1c147dcb2cd919d5
 DIST git-manpages-2.37.3.tar.xz 510096 BLAKE2B 
0bc0b8c1818a06a6c7126119c04d2936bd38e997027bb31be5ad6bea2b43d71c5e9a76a29c576d84bd00c11f09bca7a67aa78a72f0171b41b93f6322c3b23808
 SHA512 
b25d4925f64e4de220dc9133d6e3ed13a397b160c27550c8700b76226f2b3a1611aec9ee24110ae16ebaceedc6617c6a04aa1b44270c7a0f166dd40d8f2f1132
+DIST git-manpages-2.38.0.rc0.tar.xz 552588 BLAKE2B 
c19de4dd8ee408f21736485b8af236862bfeb95a867e9fb0dcb7aee129079d4ad852d9d43f998dcd724998f8cf0b01ecdb5576e5c8f321cef9d7fe200ae21de9
 SHA512 
e37bed332e4118299c8b874d5d24de45f758c55fdbfc9284609e70b2e39df1494ea88c45b453f2946a015b76d7489e0954f1134d5f49a92d086a47828925ee28

diff --git a/dev-vcs/git/git-9999.ebuild b/dev-vcs/git/git-2.38.0_rc0.ebuild
similarity index 75%
copy from dev-vcs/git/git-9999.ebuild
copy to dev-vcs/git/git-2.38.0_rc0.ebuild
index 5b04055c6684..f68fb68b1f50 100644
--- a/dev-vcs/git/git-9999.ebuild
+++ b/dev-vcs/git/git-2.38.0_rc0.ebuild
@@ -8,12 +8,14 @@ GENTOO_DEPEND_ON_PERL=no
 # bug #329479: git-remote-testgit is not multiple-version aware
 PYTHON_COMPAT=( python3_{8..10} )
 
-inherit toolchain-funcs perl-module bash-completion-r1 plocale 
python-single-r1 systemd
+inherit toolchain-funcs perl-module bash-completion-r1 optfeature plocale 
python-single-r1 systemd
 
 PLOCALES="bg ca de es fr is it ko pt_PT ru sv vi zh_CN"
+
 if [[ ${PV} == *9999 ]]; then
-       inherit git-r3
        EGIT_REPO_URI="https://git.kernel.org/pub/scm/git/git.git";
+
+       inherit git-r3
        # Please ensure that all _four_ 9999 ebuilds get updated; they track 
the 4 upstream branches.
        # See https://git-scm.com/docs/gitworkflows#_graduation
        # In order of stability:
@@ -21,7 +23,7 @@ if [[ ${PV} == *9999 ]]; then
        # 9999-r1: master
        # 9999-r2: next
        # 9999-r3: seen
-       case "${PVR}" in
+       case ${PVR} in
                9999) EGIT_BRANCH=maint ;;
                9999-r1) EGIT_BRANCH=master ;;
                9999-r2) EGIT_BRANCH=next;;
@@ -34,44 +36,49 @@ MY_P="${PN}-${MY_PV}"
 
 DOC_VER="${MY_PV}"
 
-DESCRIPTION="stupid content tracker: distributed VCS designed for speed and 
efficiency"
+DESCRIPTION="Stupid content tracker: distributed VCS designed for speed and 
efficiency"
 HOMEPAGE="https://www.git-scm.com/";
+
 if [[ ${PV} != *9999 ]]; then
        SRC_URI_SUFFIX="xz"
        SRC_URI_KORG="https://www.kernel.org/pub/software/scm/git";
-       [[ "${PV/rc}" != "${PV}" ]] && SRC_URI_KORG+='/testing'
-       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}
-                       
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       doc? (
-                       
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       )"
-       [[ "${PV}" == *_rc* ]] || \
-       KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos 
~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+
+       [[ ${PV/rc} != ${PV} ]] && SRC_URI_KORG+='/testing'
+
+       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" 
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" doc? ( 
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX} )"
+
+       if [[ ${PV} != *_rc* ]] ; then
+               KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k 
~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux 
~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+       fi
 fi
 
+S="${WORKDIR}"/${MY_P}
+
 LICENSE="GPL-2"
 SLOT="0"
-IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +ppcsha1 selinux subversion tk 
+webdav xinetd cvs test"
+IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +safe-directory selinux 
subversion tk +webdav xinetd cvs test"
 
 # Common to both DEPEND and RDEPEND
 DEPEND="
-       gnome-keyring? (
-               app-crypt/libsecret
-               dev-libs/glib:2
-       )
-       dev-libs/openssl:0=
+       dev-libs/openssl:=
        sys-libs/zlib
-       pcre? ( dev-libs/libpcre2:= )
-       perl? ( dev-lang/perl:=[-build(-)] )
-       tk? ( dev-lang/tk:0= )
        curl? (
                net-misc/curl
                webdav? ( dev-libs/expat )
        )
+       gnome-keyring? (
+               app-crypt/libsecret
+               dev-libs/glib:2
+       )
        iconv? ( virtual/libiconv )
+       pcre? ( dev-libs/libpcre2:= )
+       perl? ( dev-lang/perl:=[-build(-)] )
+       tk? ( dev-lang/tk:= )
 "
-
-RDEPEND="${DEPEND}
+RDEPEND="
+       ${DEPEND}
        gpg? ( app-crypt/gnupg )
        perl? (
                dev-perl/Error
@@ -120,12 +127,10 @@ BDEPEND="
 
 # Live ebuild builds man pages and HTML docs, additionally
 if [[ ${PV} == *9999 ]]; then
-       BDEPEND="${BDEPEND}
-               app-text/asciidoc"
+       BDEPEND+=" app-text/asciidoc"
 fi
 
 SITEFILE="50${PN}-gentoo.el"
-S="${WORKDIR}/${MY_P}"
 
 REQUIRED_USE="
        cgi? ( perl )
@@ -140,8 +145,8 @@ REQUIRED_USE="
 RESTRICT="!test? ( test )"
 
 PATCHES=(
-       # bug #350330 - automagic CVS when we don't want it is bad.
-       "${FILESDIR}"/git-2.33.0_rc0-optional-cvs.patch
+       # Avoid automagic CVS, bug #350330
+       "${FILESDIR}"/git-2.37.0_rc1-optional-cvs.patch
 
        # Make submodule output quiet
        "${FILESDIR}"/git-2.21.0-quiet-submodules-testcase.patch
@@ -151,7 +156,7 @@ pkg_setup() {
        if use subversion && has_version "dev-vcs/subversion[dso]" ; then
                ewarn "Per Gentoo bugs #223747, #238586, when subversion is 
built"
                ewarn "with USE=dso, there may be weird crashes in git-svn. You"
-               ewarn "have been warned."
+               ewarn "have been warned!"
        fi
 
        if use perforce ; then
@@ -166,20 +171,20 @@ exportmakeopts() {
 
        myopts=(
                ASCIIDOC_NO_ROFF=YesPlease
-               $(usex cvs '' NO_CVS=YesPlease)
-               $(usex elibc_musl NO_REGEX=YesPlease '')
-               $(usex iconv '' NO_ICONV=YesPlease)
-               $(usex nls '' NO_GETTEXT=YesPlease)
+
                $(usex perl 'INSTALLDIRS=vendor 
NO_PERL_CPAN_FALLBACKS=YesPlease' NO_PERL=YesPlease)
-               $(usex perforce '' NO_PYTHON=YesPlease)
-               $(usex subversion '' NO_SVN_TESTS=YesPlease)
-               $(usex tk '' NO_TCLTK=YesPlease)
+
+               $(usev elibc_musl NO_REGEX=YesPlease)
+               $(usev !cvs NO_CVS=YesPlease)
+               $(usev !iconv NO_ICONV=YesPlease)
+               $(usev !nls NO_GETTEXT=YesPlease)
+               $(usev !perforce NO_PYTHON=YesPlease)
+               $(usev !subversion NO_SVN_TESTS=YesPlease)
+               $(usev !tk NO_TCLTK=YesPlease)
        )
 
        if use blksha1 ; then
                myopts+=( BLK_SHA1=YesPlease )
-       elif use ppcsha1 ; then
-               myopts+=( PPC_SHA1=YesPlease )
        fi
 
        if use curl ; then
@@ -188,7 +193,7 @@ exportmakeopts() {
                myopts+=( NO_CURL=YesPlease )
        fi
 
-       # broken assumptions, because of static build system ...
+       # Broken assumptions because of static build system
        myopts+=(
                NO_FINK=YesPlease
                NO_DARWIN_PORTS=YesPlease
@@ -200,26 +205,26 @@ exportmakeopts() {
                NO_EXTERNAL_GREP=
        )
 
-       # can't define this to null, since the entire makefile depends on it
+       # Can't define this to null, since the entire makefile depends on it
        sed -i -e '/\/usr\/local/s/BASIC_/#BASIC_/' Makefile || die
 
        if use pcre; then
                myopts+=( USE_LIBPCRE2=YesPlease )
                extlibs+=( -lpcre2-8 )
        fi
+
        if [[ ${CHOST} == *-solaris* ]]; then
                myopts+=(
                        NEEDS_LIBICONV=YesPlease
                        HAVE_CLOCK_MONOTONIC=1
                )
-               if grep -Fq getdelim "${EROOT}"/usr/include/stdio.h ; then
+
+               if grep -Fq getdelim "${ESYSROOT}"/usr/include/stdio.h ; then
                        myopts+=( HAVE_GETDELIM=1 )
                fi
        fi
 
-       if has_version '>=app-text/asciidoc-8.0' ; then
-               myopts+=( ASCIIDOC8=YesPlease )
-       fi
+       myopts+=( ASCIIDOC8=YesPlease )
 
        export MY_MAKEOPTS="${myopts[@]}"
        export EXTLIBS="${extlibs[@]}"
@@ -228,8 +233,10 @@ exportmakeopts() {
 src_unpack() {
        if [[ ${PV} != *9999 ]] ; then
                unpack ${MY_P}.tar.${SRC_URI_SUFFIX}
+
                cd "${S}" || die
                unpack ${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
+
                if use doc ; then
                        pushd "${S}"/Documentation &>/dev/null || die
                        unpack ${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
@@ -237,14 +244,14 @@ src_unpack() {
                fi
        else
                git-r3_src_unpack
-               #cp "${FILESDIR}"/GIT-VERSION-GEN .
+               #cp "${FILESDIR}"/GIT-VERSION-GEN . || die
        fi
 
 }
 
 src_prepare() {
-       # add experimental patches to improve mediawiki support
-       # see patches for origin
+       # Add experimental patches to improve mediawiki support,
+       # see patches for origin.
        if use mediawiki-experimental ; then
                PATCHES+=(
                        "${FILESDIR}"/git-2.7.0-mediawiki-namespaces.patch
@@ -253,6 +260,14 @@ src_prepare() {
                )
        fi
 
+       if ! use safe-directory ; then
+               # This patch neuters the "safe directory" detection.
+               # bugs #838271, #838223
+               PATCHES+=(
+                       "${FILESDIR}"/git-2.37.2-unsafe-directory.patch
+               )
+       fi
+
        default
 
        if use prefix ; then
@@ -278,21 +293,37 @@ git_emake() {
        # bug #320647: PYTHON_PATH
        local PYTHON_PATH=""
        use perforce && PYTHON_PATH="${PYTHON}"
-       emake ${MY_MAKEOPTS} \
-               prefix="${EPREFIX}"/usr \
-               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html \
-               perllibdir="$(use perl && perl_get_raw_vendorlib)" \
-               sysconfdir="${EPREFIX}"/etc \
-               GIT_TEST_OPTS="--no-color" \
-               OPTAR="$(tc-getAR)" \
-               OPTCC="$(tc-getCC)" \
-               OPTCFLAGS="${CFLAGS}" \
-               OPTLDFLAGS="${LDFLAGS}" \
-               PERL_PATH="${EPREFIX}/usr/bin/perl" \
-               PERL_MM_OPT="" \
-               PYTHON_PATH="${PYTHON_PATH}" \
-               V=1 \
+
+       local mymakeargs=(
+               ${MY_MAKEOPTS}
+
+               prefix="${EPREFIX}"/usr
+               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html
+               perllibdir="$(use perl && perl_get_raw_vendorlib)"
+               sysconfdir="${EPREFIX}"/etc
+
+               CC="$(tc-getCC)"
+               CFLAGS="${CFLAGS}"
+               PKG_CONFIG="$(tc-getPKG_CONFIG)"
+
+               # TODO: --verbose?
+               GIT_TEST_OPTS="--no-color"
+
+               OPTAR="$(tc-getAR)"
+               OPTCC="$(tc-getCC)"
+               OPTCFLAGS="${CFLAGS}"
+               OPTLDFLAGS="${LDFLAGS}"
+
+               PERL_PATH="${EPREFIX}/usr/bin/perl"
+               PERL_MM_OPT=""
+
+               PYTHON_PATH="${PYTHON_PATH}"
+
+               V=1
                "$@"
+       )
+
+       emake "${mymakeargs[@]}"
 }
 
 src_configure() {
@@ -300,58 +331,163 @@ src_configure() {
 }
 
 src_compile() {
-       git_emake || die "emake failed"
+       git_emake
 
        if use perl && use cgi ; then
-               git_emake gitweb || die "emake gitweb (cgi) failed"
+               git_emake gitweb
        fi
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
-               pushd contrib/credential/osxkeychain &>/dev/null || die
-               git_emake CC=$(tc-getCC) CFLAGS="${CFLAGS}" \
-                       || die "emake credential-osxkeychain"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/osxkeychain
        fi
 
        pushd Documentation &>/dev/null || die
        if [[ ${PV} == *9999 ]] ; then
-               git_emake man || die "emake man failed"
+               git_emake man
                if use doc ; then
-                       git_emake info html || die "emake info html failed"
+                       git_emake info html
                fi
        else
                if use doc ; then
-                       git_emake info || die "emake info html failed"
+                       git_emake info
                fi
        fi
        popd &>/dev/null || die
 
        if use gnome-keyring ; then
-               pushd contrib/credential/libsecret &>/dev/null || die
-               git_emake CC="$(tc-getCC)" CFLAGS="${CFLAGS}" 
PKG_CONFIG="$(tc-getPKG_CONFIG)"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/libsecret
        fi
 
        pushd contrib/subtree &>/dev/null || die
-       git_emake git-subtree || die
+       git_emake git-subtree
        # git-subtree.1 requires the full USE=doc dependency stack
        use doc && git_emake git-subtree.html git-subtree.1
        popd &>/dev/null || die
 
-       pushd contrib/diff-highlight &>/dev/null || die
-       git_emake || die
-       popd &>/dev/null || die
+       git_emake -C contrib/diff-highlight
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake || die
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git
+       fi
+}
+
+src_test() {
+       local disabled=(
+               # We make safe-directory optional
+               t0033-safe-directory.sh
+       )
+
+       local tests_cvs=(
+               t9200-git-cvsexportcommit.sh
+               t9400-git-cvsserver-server.sh
+               t9401-git-cvsserver-crlf.sh
+               t9402-git-cvsserver-refs.sh
+               t9600-cvsimport.sh
+               t9601-cvsimport-vendor-branch.sh
+               t9602-cvsimport-branches-tags.sh
+               t9603-cvsimport-patchsets.sh
+               t9604-cvsimport-timestamps.sh
+       )
 
+       local tests_perl=(
+               t3701-add-interactive.sh
+               t5502-quickfetch.sh
+               t5512-ls-remote.sh
+               t5520-pull.sh
+               t7106-reset-unborn-branch.sh
+               t7501-commit.sh
+       )
+       # Bug #225601 - t0004 is not suitable for root perm
+       # Bug #219839 - t1004 is not suitable for root perm
+       # t0001-init.sh - check for init notices EPERM*  fails
+       local tests_nonroot=(
+               t0001-init.sh
+               t0004-unwritable.sh
+               t0070-fundamental.sh
+               t1004-read-tree-m-u-wf.sh
+               t3700-add.sh
+               t7300-clean.sh
+       )
+       # t9100 still fails with symlinks in SVN 1.7
+       local test_svn=( t9100-git-svn-basic.sh )
+
+       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
+       if ! has_version app-arch/unzip ; then
+               einfo "Disabling tar-tree tests"
+               disabled+=( t5000-tar-tree.sh )
        fi
+
+       local cvs=0
+       use cvs && let cvs=${cvs}+1
+       if [[ ${EUID} -eq 0 ]] ; then
+               if [[ ${cvs} -eq 1 ]] ; then
+                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
+                       ewarn "You should retest with FEATURES=userpriv!"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+               einfo "Skipping other tests that require being non-root"
+               disabled+=( ${tests_nonroot[@]} )
+       else
+               if [[ ${cvs} -gt 0 ]] && has_version dev-vcs/cvs ; then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -gt 1 ]] && has_version "dev-vcs/cvs[server]" ; 
then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -lt 3 ]] ; then
+                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+       fi
+
+       if ! use perl ; then
+               einfo "Disabling tests that need Perl"
+               disabled+=( ${tests_perl[@]} )
+       fi
+
+       einfo "Disabling tests that fail with SVN 1.7"
+       disabled+=( ${test_svn[@]} )
+
+       # Reset all previously disabled tests
+       pushd t &>/dev/null || die
+       local i
+       for i in *.sh.DISABLED ; do
+               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
+       done
+       einfo "Disabled tests:"
+       for i in ${disabled[@]} ; do
+               if [[ -f "${i}" ]] ; then
+                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
+               fi
+       done
+
+       # Avoid the test system removing the results because we want them 
ourselves
+       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
+
+       # Clean old results first, must always run
+       nonfatal git_emake clean
+       popd &>/dev/null || die
+
+       # Now run the tests, keep going if we hit an error, and don't terminate 
on
+       # failure
+       local rc
+       einfo "Start test run"
+       #MAKEOPTS=-j1
+       nonfatal git_emake --keep-going test
+       rc=$?
+
+       # Display nice results, now print the results
+       pushd t &>/dev/null || die
+       nonfatal git_emake aggregate-results
+
+       # And bail if there was a problem
+       [[ ${rc} -eq 0 ]] || die "Tests failed. Please file a bug!"
 }
 
 src_install() {
-       git_emake DESTDIR="${D}" install || die "make install failed"
+       git_emake DESTDIR="${D}" install
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
                dobin contrib/credential/osxkeychain/git-credential-osxkeychain
@@ -391,19 +527,17 @@ src_install() {
 
        # git-subtree
        pushd contrib/subtree &>/dev/null || die
-       git_emake DESTDIR="${D}" install || die "Failed to emake install for 
git-subtree"
+       git_emake DESTDIR="${D}" install
        if use doc ; then
                # Do not move git subtree install-man outside USE=doc!
-               git_emake DESTDIR="${D}" install-man install-html || die 
"Failed to emake install-html install-man for git-subtree"
+               git_emake DESTDIR="${D}" install-man install-html
        fi
        newdoc README README.git-subtree
        dodoc git-subtree.txt
        popd &>/dev/null || die
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake DESTDIR="${D}" install
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git DESTDIR="${D}" install
        fi
 
        # diff-highlight
@@ -453,10 +587,7 @@ src_install() {
        )
        local i
        for i in "${contrib_objects[@]}" ; do
-               cp -rf \
-                       "${S}"/contrib/${i} \
-                       "${ED}"/usr/share/${PN}/contrib \
-                       || die "Failed contrib ${i}"
+               cp -rf "${S}"/contrib/${i} "${ED}"/usr/share/${PN}/contrib || 
die "Failed contrib ${i}"
        done
 
        if use perl && use cgi ; then
@@ -493,8 +624,7 @@ src_install() {
        if ! use prefix ; then
                newinitd "${FILESDIR}"/git-daemon-r2.initd git-daemon
                newconfd "${FILESDIR}"/git-daemon.confd git-daemon
-               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" \
-                       "[email protected]"
+               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" 
"[email protected]"
                systemd_dounit "${FILESDIR}/git-daemon.socket"
        fi
 
@@ -511,130 +641,17 @@ src_install() {
        plocale_for_each_disabled_locale rm_loc
 }
 
-src_test() {
-       local disabled=()
-       local tests_cvs=(
-               t9200-git-cvsexportcommit.sh
-               t9400-git-cvsserver-server.sh
-               t9401-git-cvsserver-crlf.sh
-               t9402-git-cvsserver-refs.sh
-               t9600-cvsimport.sh
-               t9601-cvsimport-vendor-branch.sh
-               t9602-cvsimport-branches-tags.sh
-               t9603-cvsimport-patchsets.sh
-               t9604-cvsimport-timestamps.sh
-       )
-       local tests_perl=(
-               t3701-add-interactive.sh
-               t5502-quickfetch.sh
-               t5512-ls-remote.sh
-               t5520-pull.sh
-               t7106-reset-unborn-branch.sh
-               t7501-commit.sh
-       )
-       # Bug #225601 - t0004 is not suitable for root perm
-       # Bug #219839 - t1004 is not suitable for root perm
-       # t0001-init.sh - check for init notices EPERM*  fails
-       local tests_nonroot=(
-               t0001-init.sh
-               t0004-unwritable.sh
-               t0070-fundamental.sh
-               t1004-read-tree-m-u-wf.sh
-               t3700-add.sh
-               t7300-clean.sh
-       )
-       # t9100 still fails with symlinks in SVN 1.7
-       local test_svn=( t9100-git-svn-basic.sh )
-
-       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
-       if ! has_version app-arch/unzip ; then
-               einfo "Disabling tar-tree tests"
-               disabled+=( t5000-tar-tree.sh )
-       fi
-
-       local cvs=0
-       use cvs && let cvs=${cvs}+1
-       if [[ ${EUID} -eq 0 ]] ; then
-               if [[ ${cvs} -eq 1 ]] ; then
-                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
-                       ewarn "You should retest with FEATURES=userpriv!"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-               einfo "Skipping other tests that require being non-root"
-               disabled+=( ${tests_nonroot[@]} )
-       else
-               [[ ${cvs} -gt 0 ]] && \
-                       has_version dev-vcs/cvs && \
-                       let cvs=${cvs}+1
-               [[ ${cvs} -gt 1 ]] && \
-                       has_version "dev-vcs/cvs[server]" && \
-                       let cvs=${cvs}+1
-               if [[ ${cvs} -lt 3 ]] ; then
-                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-       fi
-
-       if ! use perl ; then
-               einfo "Disabling tests that need Perl"
-               disabled+=( ${tests_perl[@]} )
+pkg_postinst() {
+       if [[ -z ${REPLACING_VERSIONS} ]] ; then
+               elog "Please read /usr/share/bash-completion/completions/git 
for Git bash command"
+               elog "completion."
+               elog "Please read /usr/share/git/git-prompt.sh for Git bash 
prompt"
+               elog "Note that the prompt bash code is now in that separate 
script"
        fi
 
-       einfo "Disabling tests that fail with SVN 1.7"
-       disabled+=( ${test_svn[@]} )
+       optfeature_header "Some scripts require additional dependencies:"
+       optfeature git-quiltimport dev-util/quilt
+       optfeature git-instaweb www-servers/lighttpd www-servers/apache 
www-servers/nginx
 
-       # Reset all previously disabled tests
-       pushd t &>/dev/null || die
-       local i
-       for i in *.sh.DISABLED ; do
-               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
-       done
-       einfo "Disabled tests:"
-       for i in ${disabled[@]} ; do
-               if [[ -f "${i}" ]] ; then
-                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
-               fi
-       done
-
-       # Avoid the test system removing the results because we want them 
ourselves
-       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
-
-       # Clean old results first, must always run
-       nonfatal git_emake clean
-       popd &>/dev/null || die
-
-       # Now run the tests, keep going if we hit an error, and don't terminate 
on
-       # failure
-       local rc
-       einfo "Start test run"
-       #MAKEOPTS=-j1
-       nonfatal git_emake --keep-going test
-       rc=$?
-
-       # Display nice results, now print the results
-       pushd t &>/dev/null || die
-       nonfatal git_emake aggregate-results
-
-       # And bail if there was a problem
-       [[ ${rc} -eq 0 ]] || die "tests failed. Please file a bug."
-}
-
-showpkgdeps() {
-       local pkg=$1
-       shift
-       elog "  $(printf "%-17s:" ${pkg}) ${@}"
-}
-
-pkg_postinst() {
-       elog "Please read /usr/share/bash-completion/completions/git for Git 
bash command"
-       elog "completion."
-       elog "Please read /usr/share/git/git-prompt.sh for Git bash prompt"
-       elog "Note that the prompt bash code is now in that separate script"
-       elog "These additional scripts need some dependencies:"
-       echo
-       showpkgdeps git-quiltimport "dev-util/quilt"
-       showpkgdeps git-instaweb \
-               "|| ( www-servers/lighttpd www-servers/apache www-servers/nginx 
)"
-       echo
        use mediawiki-experimental && ewarn "Using experimental git-mediawiki 
patches. The stability of cloned wiki filesystems is not guaranteed."
 }

diff --git a/dev-vcs/git/git-9999-r1.ebuild b/dev-vcs/git/git-9999-r1.ebuild
index 5b04055c6684..f68fb68b1f50 100644
--- a/dev-vcs/git/git-9999-r1.ebuild
+++ b/dev-vcs/git/git-9999-r1.ebuild
@@ -8,12 +8,14 @@ GENTOO_DEPEND_ON_PERL=no
 # bug #329479: git-remote-testgit is not multiple-version aware
 PYTHON_COMPAT=( python3_{8..10} )
 
-inherit toolchain-funcs perl-module bash-completion-r1 plocale 
python-single-r1 systemd
+inherit toolchain-funcs perl-module bash-completion-r1 optfeature plocale 
python-single-r1 systemd
 
 PLOCALES="bg ca de es fr is it ko pt_PT ru sv vi zh_CN"
+
 if [[ ${PV} == *9999 ]]; then
-       inherit git-r3
        EGIT_REPO_URI="https://git.kernel.org/pub/scm/git/git.git";
+
+       inherit git-r3
        # Please ensure that all _four_ 9999 ebuilds get updated; they track 
the 4 upstream branches.
        # See https://git-scm.com/docs/gitworkflows#_graduation
        # In order of stability:
@@ -21,7 +23,7 @@ if [[ ${PV} == *9999 ]]; then
        # 9999-r1: master
        # 9999-r2: next
        # 9999-r3: seen
-       case "${PVR}" in
+       case ${PVR} in
                9999) EGIT_BRANCH=maint ;;
                9999-r1) EGIT_BRANCH=master ;;
                9999-r2) EGIT_BRANCH=next;;
@@ -34,44 +36,49 @@ MY_P="${PN}-${MY_PV}"
 
 DOC_VER="${MY_PV}"
 
-DESCRIPTION="stupid content tracker: distributed VCS designed for speed and 
efficiency"
+DESCRIPTION="Stupid content tracker: distributed VCS designed for speed and 
efficiency"
 HOMEPAGE="https://www.git-scm.com/";
+
 if [[ ${PV} != *9999 ]]; then
        SRC_URI_SUFFIX="xz"
        SRC_URI_KORG="https://www.kernel.org/pub/software/scm/git";
-       [[ "${PV/rc}" != "${PV}" ]] && SRC_URI_KORG+='/testing'
-       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}
-                       
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       doc? (
-                       
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       )"
-       [[ "${PV}" == *_rc* ]] || \
-       KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos 
~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+
+       [[ ${PV/rc} != ${PV} ]] && SRC_URI_KORG+='/testing'
+
+       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" 
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" doc? ( 
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX} )"
+
+       if [[ ${PV} != *_rc* ]] ; then
+               KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k 
~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux 
~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+       fi
 fi
 
+S="${WORKDIR}"/${MY_P}
+
 LICENSE="GPL-2"
 SLOT="0"
-IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +ppcsha1 selinux subversion tk 
+webdav xinetd cvs test"
+IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +safe-directory selinux 
subversion tk +webdav xinetd cvs test"
 
 # Common to both DEPEND and RDEPEND
 DEPEND="
-       gnome-keyring? (
-               app-crypt/libsecret
-               dev-libs/glib:2
-       )
-       dev-libs/openssl:0=
+       dev-libs/openssl:=
        sys-libs/zlib
-       pcre? ( dev-libs/libpcre2:= )
-       perl? ( dev-lang/perl:=[-build(-)] )
-       tk? ( dev-lang/tk:0= )
        curl? (
                net-misc/curl
                webdav? ( dev-libs/expat )
        )
+       gnome-keyring? (
+               app-crypt/libsecret
+               dev-libs/glib:2
+       )
        iconv? ( virtual/libiconv )
+       pcre? ( dev-libs/libpcre2:= )
+       perl? ( dev-lang/perl:=[-build(-)] )
+       tk? ( dev-lang/tk:= )
 "
-
-RDEPEND="${DEPEND}
+RDEPEND="
+       ${DEPEND}
        gpg? ( app-crypt/gnupg )
        perl? (
                dev-perl/Error
@@ -120,12 +127,10 @@ BDEPEND="
 
 # Live ebuild builds man pages and HTML docs, additionally
 if [[ ${PV} == *9999 ]]; then
-       BDEPEND="${BDEPEND}
-               app-text/asciidoc"
+       BDEPEND+=" app-text/asciidoc"
 fi
 
 SITEFILE="50${PN}-gentoo.el"
-S="${WORKDIR}/${MY_P}"
 
 REQUIRED_USE="
        cgi? ( perl )
@@ -140,8 +145,8 @@ REQUIRED_USE="
 RESTRICT="!test? ( test )"
 
 PATCHES=(
-       # bug #350330 - automagic CVS when we don't want it is bad.
-       "${FILESDIR}"/git-2.33.0_rc0-optional-cvs.patch
+       # Avoid automagic CVS, bug #350330
+       "${FILESDIR}"/git-2.37.0_rc1-optional-cvs.patch
 
        # Make submodule output quiet
        "${FILESDIR}"/git-2.21.0-quiet-submodules-testcase.patch
@@ -151,7 +156,7 @@ pkg_setup() {
        if use subversion && has_version "dev-vcs/subversion[dso]" ; then
                ewarn "Per Gentoo bugs #223747, #238586, when subversion is 
built"
                ewarn "with USE=dso, there may be weird crashes in git-svn. You"
-               ewarn "have been warned."
+               ewarn "have been warned!"
        fi
 
        if use perforce ; then
@@ -166,20 +171,20 @@ exportmakeopts() {
 
        myopts=(
                ASCIIDOC_NO_ROFF=YesPlease
-               $(usex cvs '' NO_CVS=YesPlease)
-               $(usex elibc_musl NO_REGEX=YesPlease '')
-               $(usex iconv '' NO_ICONV=YesPlease)
-               $(usex nls '' NO_GETTEXT=YesPlease)
+
                $(usex perl 'INSTALLDIRS=vendor 
NO_PERL_CPAN_FALLBACKS=YesPlease' NO_PERL=YesPlease)
-               $(usex perforce '' NO_PYTHON=YesPlease)
-               $(usex subversion '' NO_SVN_TESTS=YesPlease)
-               $(usex tk '' NO_TCLTK=YesPlease)
+
+               $(usev elibc_musl NO_REGEX=YesPlease)
+               $(usev !cvs NO_CVS=YesPlease)
+               $(usev !iconv NO_ICONV=YesPlease)
+               $(usev !nls NO_GETTEXT=YesPlease)
+               $(usev !perforce NO_PYTHON=YesPlease)
+               $(usev !subversion NO_SVN_TESTS=YesPlease)
+               $(usev !tk NO_TCLTK=YesPlease)
        )
 
        if use blksha1 ; then
                myopts+=( BLK_SHA1=YesPlease )
-       elif use ppcsha1 ; then
-               myopts+=( PPC_SHA1=YesPlease )
        fi
 
        if use curl ; then
@@ -188,7 +193,7 @@ exportmakeopts() {
                myopts+=( NO_CURL=YesPlease )
        fi
 
-       # broken assumptions, because of static build system ...
+       # Broken assumptions because of static build system
        myopts+=(
                NO_FINK=YesPlease
                NO_DARWIN_PORTS=YesPlease
@@ -200,26 +205,26 @@ exportmakeopts() {
                NO_EXTERNAL_GREP=
        )
 
-       # can't define this to null, since the entire makefile depends on it
+       # Can't define this to null, since the entire makefile depends on it
        sed -i -e '/\/usr\/local/s/BASIC_/#BASIC_/' Makefile || die
 
        if use pcre; then
                myopts+=( USE_LIBPCRE2=YesPlease )
                extlibs+=( -lpcre2-8 )
        fi
+
        if [[ ${CHOST} == *-solaris* ]]; then
                myopts+=(
                        NEEDS_LIBICONV=YesPlease
                        HAVE_CLOCK_MONOTONIC=1
                )
-               if grep -Fq getdelim "${EROOT}"/usr/include/stdio.h ; then
+
+               if grep -Fq getdelim "${ESYSROOT}"/usr/include/stdio.h ; then
                        myopts+=( HAVE_GETDELIM=1 )
                fi
        fi
 
-       if has_version '>=app-text/asciidoc-8.0' ; then
-               myopts+=( ASCIIDOC8=YesPlease )
-       fi
+       myopts+=( ASCIIDOC8=YesPlease )
 
        export MY_MAKEOPTS="${myopts[@]}"
        export EXTLIBS="${extlibs[@]}"
@@ -228,8 +233,10 @@ exportmakeopts() {
 src_unpack() {
        if [[ ${PV} != *9999 ]] ; then
                unpack ${MY_P}.tar.${SRC_URI_SUFFIX}
+
                cd "${S}" || die
                unpack ${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
+
                if use doc ; then
                        pushd "${S}"/Documentation &>/dev/null || die
                        unpack ${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
@@ -237,14 +244,14 @@ src_unpack() {
                fi
        else
                git-r3_src_unpack
-               #cp "${FILESDIR}"/GIT-VERSION-GEN .
+               #cp "${FILESDIR}"/GIT-VERSION-GEN . || die
        fi
 
 }
 
 src_prepare() {
-       # add experimental patches to improve mediawiki support
-       # see patches for origin
+       # Add experimental patches to improve mediawiki support,
+       # see patches for origin.
        if use mediawiki-experimental ; then
                PATCHES+=(
                        "${FILESDIR}"/git-2.7.0-mediawiki-namespaces.patch
@@ -253,6 +260,14 @@ src_prepare() {
                )
        fi
 
+       if ! use safe-directory ; then
+               # This patch neuters the "safe directory" detection.
+               # bugs #838271, #838223
+               PATCHES+=(
+                       "${FILESDIR}"/git-2.37.2-unsafe-directory.patch
+               )
+       fi
+
        default
 
        if use prefix ; then
@@ -278,21 +293,37 @@ git_emake() {
        # bug #320647: PYTHON_PATH
        local PYTHON_PATH=""
        use perforce && PYTHON_PATH="${PYTHON}"
-       emake ${MY_MAKEOPTS} \
-               prefix="${EPREFIX}"/usr \
-               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html \
-               perllibdir="$(use perl && perl_get_raw_vendorlib)" \
-               sysconfdir="${EPREFIX}"/etc \
-               GIT_TEST_OPTS="--no-color" \
-               OPTAR="$(tc-getAR)" \
-               OPTCC="$(tc-getCC)" \
-               OPTCFLAGS="${CFLAGS}" \
-               OPTLDFLAGS="${LDFLAGS}" \
-               PERL_PATH="${EPREFIX}/usr/bin/perl" \
-               PERL_MM_OPT="" \
-               PYTHON_PATH="${PYTHON_PATH}" \
-               V=1 \
+
+       local mymakeargs=(
+               ${MY_MAKEOPTS}
+
+               prefix="${EPREFIX}"/usr
+               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html
+               perllibdir="$(use perl && perl_get_raw_vendorlib)"
+               sysconfdir="${EPREFIX}"/etc
+
+               CC="$(tc-getCC)"
+               CFLAGS="${CFLAGS}"
+               PKG_CONFIG="$(tc-getPKG_CONFIG)"
+
+               # TODO: --verbose?
+               GIT_TEST_OPTS="--no-color"
+
+               OPTAR="$(tc-getAR)"
+               OPTCC="$(tc-getCC)"
+               OPTCFLAGS="${CFLAGS}"
+               OPTLDFLAGS="${LDFLAGS}"
+
+               PERL_PATH="${EPREFIX}/usr/bin/perl"
+               PERL_MM_OPT=""
+
+               PYTHON_PATH="${PYTHON_PATH}"
+
+               V=1
                "$@"
+       )
+
+       emake "${mymakeargs[@]}"
 }
 
 src_configure() {
@@ -300,58 +331,163 @@ src_configure() {
 }
 
 src_compile() {
-       git_emake || die "emake failed"
+       git_emake
 
        if use perl && use cgi ; then
-               git_emake gitweb || die "emake gitweb (cgi) failed"
+               git_emake gitweb
        fi
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
-               pushd contrib/credential/osxkeychain &>/dev/null || die
-               git_emake CC=$(tc-getCC) CFLAGS="${CFLAGS}" \
-                       || die "emake credential-osxkeychain"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/osxkeychain
        fi
 
        pushd Documentation &>/dev/null || die
        if [[ ${PV} == *9999 ]] ; then
-               git_emake man || die "emake man failed"
+               git_emake man
                if use doc ; then
-                       git_emake info html || die "emake info html failed"
+                       git_emake info html
                fi
        else
                if use doc ; then
-                       git_emake info || die "emake info html failed"
+                       git_emake info
                fi
        fi
        popd &>/dev/null || die
 
        if use gnome-keyring ; then
-               pushd contrib/credential/libsecret &>/dev/null || die
-               git_emake CC="$(tc-getCC)" CFLAGS="${CFLAGS}" 
PKG_CONFIG="$(tc-getPKG_CONFIG)"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/libsecret
        fi
 
        pushd contrib/subtree &>/dev/null || die
-       git_emake git-subtree || die
+       git_emake git-subtree
        # git-subtree.1 requires the full USE=doc dependency stack
        use doc && git_emake git-subtree.html git-subtree.1
        popd &>/dev/null || die
 
-       pushd contrib/diff-highlight &>/dev/null || die
-       git_emake || die
-       popd &>/dev/null || die
+       git_emake -C contrib/diff-highlight
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake || die
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git
+       fi
+}
+
+src_test() {
+       local disabled=(
+               # We make safe-directory optional
+               t0033-safe-directory.sh
+       )
+
+       local tests_cvs=(
+               t9200-git-cvsexportcommit.sh
+               t9400-git-cvsserver-server.sh
+               t9401-git-cvsserver-crlf.sh
+               t9402-git-cvsserver-refs.sh
+               t9600-cvsimport.sh
+               t9601-cvsimport-vendor-branch.sh
+               t9602-cvsimport-branches-tags.sh
+               t9603-cvsimport-patchsets.sh
+               t9604-cvsimport-timestamps.sh
+       )
 
+       local tests_perl=(
+               t3701-add-interactive.sh
+               t5502-quickfetch.sh
+               t5512-ls-remote.sh
+               t5520-pull.sh
+               t7106-reset-unborn-branch.sh
+               t7501-commit.sh
+       )
+       # Bug #225601 - t0004 is not suitable for root perm
+       # Bug #219839 - t1004 is not suitable for root perm
+       # t0001-init.sh - check for init notices EPERM*  fails
+       local tests_nonroot=(
+               t0001-init.sh
+               t0004-unwritable.sh
+               t0070-fundamental.sh
+               t1004-read-tree-m-u-wf.sh
+               t3700-add.sh
+               t7300-clean.sh
+       )
+       # t9100 still fails with symlinks in SVN 1.7
+       local test_svn=( t9100-git-svn-basic.sh )
+
+       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
+       if ! has_version app-arch/unzip ; then
+               einfo "Disabling tar-tree tests"
+               disabled+=( t5000-tar-tree.sh )
        fi
+
+       local cvs=0
+       use cvs && let cvs=${cvs}+1
+       if [[ ${EUID} -eq 0 ]] ; then
+               if [[ ${cvs} -eq 1 ]] ; then
+                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
+                       ewarn "You should retest with FEATURES=userpriv!"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+               einfo "Skipping other tests that require being non-root"
+               disabled+=( ${tests_nonroot[@]} )
+       else
+               if [[ ${cvs} -gt 0 ]] && has_version dev-vcs/cvs ; then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -gt 1 ]] && has_version "dev-vcs/cvs[server]" ; 
then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -lt 3 ]] ; then
+                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+       fi
+
+       if ! use perl ; then
+               einfo "Disabling tests that need Perl"
+               disabled+=( ${tests_perl[@]} )
+       fi
+
+       einfo "Disabling tests that fail with SVN 1.7"
+       disabled+=( ${test_svn[@]} )
+
+       # Reset all previously disabled tests
+       pushd t &>/dev/null || die
+       local i
+       for i in *.sh.DISABLED ; do
+               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
+       done
+       einfo "Disabled tests:"
+       for i in ${disabled[@]} ; do
+               if [[ -f "${i}" ]] ; then
+                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
+               fi
+       done
+
+       # Avoid the test system removing the results because we want them 
ourselves
+       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
+
+       # Clean old results first, must always run
+       nonfatal git_emake clean
+       popd &>/dev/null || die
+
+       # Now run the tests, keep going if we hit an error, and don't terminate 
on
+       # failure
+       local rc
+       einfo "Start test run"
+       #MAKEOPTS=-j1
+       nonfatal git_emake --keep-going test
+       rc=$?
+
+       # Display nice results, now print the results
+       pushd t &>/dev/null || die
+       nonfatal git_emake aggregate-results
+
+       # And bail if there was a problem
+       [[ ${rc} -eq 0 ]] || die "Tests failed. Please file a bug!"
 }
 
 src_install() {
-       git_emake DESTDIR="${D}" install || die "make install failed"
+       git_emake DESTDIR="${D}" install
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
                dobin contrib/credential/osxkeychain/git-credential-osxkeychain
@@ -391,19 +527,17 @@ src_install() {
 
        # git-subtree
        pushd contrib/subtree &>/dev/null || die
-       git_emake DESTDIR="${D}" install || die "Failed to emake install for 
git-subtree"
+       git_emake DESTDIR="${D}" install
        if use doc ; then
                # Do not move git subtree install-man outside USE=doc!
-               git_emake DESTDIR="${D}" install-man install-html || die 
"Failed to emake install-html install-man for git-subtree"
+               git_emake DESTDIR="${D}" install-man install-html
        fi
        newdoc README README.git-subtree
        dodoc git-subtree.txt
        popd &>/dev/null || die
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake DESTDIR="${D}" install
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git DESTDIR="${D}" install
        fi
 
        # diff-highlight
@@ -453,10 +587,7 @@ src_install() {
        )
        local i
        for i in "${contrib_objects[@]}" ; do
-               cp -rf \
-                       "${S}"/contrib/${i} \
-                       "${ED}"/usr/share/${PN}/contrib \
-                       || die "Failed contrib ${i}"
+               cp -rf "${S}"/contrib/${i} "${ED}"/usr/share/${PN}/contrib || 
die "Failed contrib ${i}"
        done
 
        if use perl && use cgi ; then
@@ -493,8 +624,7 @@ src_install() {
        if ! use prefix ; then
                newinitd "${FILESDIR}"/git-daemon-r2.initd git-daemon
                newconfd "${FILESDIR}"/git-daemon.confd git-daemon
-               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" \
-                       "[email protected]"
+               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" 
"[email protected]"
                systemd_dounit "${FILESDIR}/git-daemon.socket"
        fi
 
@@ -511,130 +641,17 @@ src_install() {
        plocale_for_each_disabled_locale rm_loc
 }
 
-src_test() {
-       local disabled=()
-       local tests_cvs=(
-               t9200-git-cvsexportcommit.sh
-               t9400-git-cvsserver-server.sh
-               t9401-git-cvsserver-crlf.sh
-               t9402-git-cvsserver-refs.sh
-               t9600-cvsimport.sh
-               t9601-cvsimport-vendor-branch.sh
-               t9602-cvsimport-branches-tags.sh
-               t9603-cvsimport-patchsets.sh
-               t9604-cvsimport-timestamps.sh
-       )
-       local tests_perl=(
-               t3701-add-interactive.sh
-               t5502-quickfetch.sh
-               t5512-ls-remote.sh
-               t5520-pull.sh
-               t7106-reset-unborn-branch.sh
-               t7501-commit.sh
-       )
-       # Bug #225601 - t0004 is not suitable for root perm
-       # Bug #219839 - t1004 is not suitable for root perm
-       # t0001-init.sh - check for init notices EPERM*  fails
-       local tests_nonroot=(
-               t0001-init.sh
-               t0004-unwritable.sh
-               t0070-fundamental.sh
-               t1004-read-tree-m-u-wf.sh
-               t3700-add.sh
-               t7300-clean.sh
-       )
-       # t9100 still fails with symlinks in SVN 1.7
-       local test_svn=( t9100-git-svn-basic.sh )
-
-       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
-       if ! has_version app-arch/unzip ; then
-               einfo "Disabling tar-tree tests"
-               disabled+=( t5000-tar-tree.sh )
-       fi
-
-       local cvs=0
-       use cvs && let cvs=${cvs}+1
-       if [[ ${EUID} -eq 0 ]] ; then
-               if [[ ${cvs} -eq 1 ]] ; then
-                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
-                       ewarn "You should retest with FEATURES=userpriv!"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-               einfo "Skipping other tests that require being non-root"
-               disabled+=( ${tests_nonroot[@]} )
-       else
-               [[ ${cvs} -gt 0 ]] && \
-                       has_version dev-vcs/cvs && \
-                       let cvs=${cvs}+1
-               [[ ${cvs} -gt 1 ]] && \
-                       has_version "dev-vcs/cvs[server]" && \
-                       let cvs=${cvs}+1
-               if [[ ${cvs} -lt 3 ]] ; then
-                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-       fi
-
-       if ! use perl ; then
-               einfo "Disabling tests that need Perl"
-               disabled+=( ${tests_perl[@]} )
+pkg_postinst() {
+       if [[ -z ${REPLACING_VERSIONS} ]] ; then
+               elog "Please read /usr/share/bash-completion/completions/git 
for Git bash command"
+               elog "completion."
+               elog "Please read /usr/share/git/git-prompt.sh for Git bash 
prompt"
+               elog "Note that the prompt bash code is now in that separate 
script"
        fi
 
-       einfo "Disabling tests that fail with SVN 1.7"
-       disabled+=( ${test_svn[@]} )
+       optfeature_header "Some scripts require additional dependencies:"
+       optfeature git-quiltimport dev-util/quilt
+       optfeature git-instaweb www-servers/lighttpd www-servers/apache 
www-servers/nginx
 
-       # Reset all previously disabled tests
-       pushd t &>/dev/null || die
-       local i
-       for i in *.sh.DISABLED ; do
-               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
-       done
-       einfo "Disabled tests:"
-       for i in ${disabled[@]} ; do
-               if [[ -f "${i}" ]] ; then
-                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
-               fi
-       done
-
-       # Avoid the test system removing the results because we want them 
ourselves
-       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
-
-       # Clean old results first, must always run
-       nonfatal git_emake clean
-       popd &>/dev/null || die
-
-       # Now run the tests, keep going if we hit an error, and don't terminate 
on
-       # failure
-       local rc
-       einfo "Start test run"
-       #MAKEOPTS=-j1
-       nonfatal git_emake --keep-going test
-       rc=$?
-
-       # Display nice results, now print the results
-       pushd t &>/dev/null || die
-       nonfatal git_emake aggregate-results
-
-       # And bail if there was a problem
-       [[ ${rc} -eq 0 ]] || die "tests failed. Please file a bug."
-}
-
-showpkgdeps() {
-       local pkg=$1
-       shift
-       elog "  $(printf "%-17s:" ${pkg}) ${@}"
-}
-
-pkg_postinst() {
-       elog "Please read /usr/share/bash-completion/completions/git for Git 
bash command"
-       elog "completion."
-       elog "Please read /usr/share/git/git-prompt.sh for Git bash prompt"
-       elog "Note that the prompt bash code is now in that separate script"
-       elog "These additional scripts need some dependencies:"
-       echo
-       showpkgdeps git-quiltimport "dev-util/quilt"
-       showpkgdeps git-instaweb \
-               "|| ( www-servers/lighttpd www-servers/apache www-servers/nginx 
)"
-       echo
        use mediawiki-experimental && ewarn "Using experimental git-mediawiki 
patches. The stability of cloned wiki filesystems is not guaranteed."
 }

diff --git a/dev-vcs/git/git-9999-r2.ebuild b/dev-vcs/git/git-9999-r2.ebuild
index 5b04055c6684..f68fb68b1f50 100644
--- a/dev-vcs/git/git-9999-r2.ebuild
+++ b/dev-vcs/git/git-9999-r2.ebuild
@@ -8,12 +8,14 @@ GENTOO_DEPEND_ON_PERL=no
 # bug #329479: git-remote-testgit is not multiple-version aware
 PYTHON_COMPAT=( python3_{8..10} )
 
-inherit toolchain-funcs perl-module bash-completion-r1 plocale 
python-single-r1 systemd
+inherit toolchain-funcs perl-module bash-completion-r1 optfeature plocale 
python-single-r1 systemd
 
 PLOCALES="bg ca de es fr is it ko pt_PT ru sv vi zh_CN"
+
 if [[ ${PV} == *9999 ]]; then
-       inherit git-r3
        EGIT_REPO_URI="https://git.kernel.org/pub/scm/git/git.git";
+
+       inherit git-r3
        # Please ensure that all _four_ 9999 ebuilds get updated; they track 
the 4 upstream branches.
        # See https://git-scm.com/docs/gitworkflows#_graduation
        # In order of stability:
@@ -21,7 +23,7 @@ if [[ ${PV} == *9999 ]]; then
        # 9999-r1: master
        # 9999-r2: next
        # 9999-r3: seen
-       case "${PVR}" in
+       case ${PVR} in
                9999) EGIT_BRANCH=maint ;;
                9999-r1) EGIT_BRANCH=master ;;
                9999-r2) EGIT_BRANCH=next;;
@@ -34,44 +36,49 @@ MY_P="${PN}-${MY_PV}"
 
 DOC_VER="${MY_PV}"
 
-DESCRIPTION="stupid content tracker: distributed VCS designed for speed and 
efficiency"
+DESCRIPTION="Stupid content tracker: distributed VCS designed for speed and 
efficiency"
 HOMEPAGE="https://www.git-scm.com/";
+
 if [[ ${PV} != *9999 ]]; then
        SRC_URI_SUFFIX="xz"
        SRC_URI_KORG="https://www.kernel.org/pub/software/scm/git";
-       [[ "${PV/rc}" != "${PV}" ]] && SRC_URI_KORG+='/testing'
-       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}
-                       
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       doc? (
-                       
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       )"
-       [[ "${PV}" == *_rc* ]] || \
-       KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos 
~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+
+       [[ ${PV/rc} != ${PV} ]] && SRC_URI_KORG+='/testing'
+
+       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" 
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" doc? ( 
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX} )"
+
+       if [[ ${PV} != *_rc* ]] ; then
+               KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k 
~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux 
~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+       fi
 fi
 
+S="${WORKDIR}"/${MY_P}
+
 LICENSE="GPL-2"
 SLOT="0"
-IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +ppcsha1 selinux subversion tk 
+webdav xinetd cvs test"
+IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +safe-directory selinux 
subversion tk +webdav xinetd cvs test"
 
 # Common to both DEPEND and RDEPEND
 DEPEND="
-       gnome-keyring? (
-               app-crypt/libsecret
-               dev-libs/glib:2
-       )
-       dev-libs/openssl:0=
+       dev-libs/openssl:=
        sys-libs/zlib
-       pcre? ( dev-libs/libpcre2:= )
-       perl? ( dev-lang/perl:=[-build(-)] )
-       tk? ( dev-lang/tk:0= )
        curl? (
                net-misc/curl
                webdav? ( dev-libs/expat )
        )
+       gnome-keyring? (
+               app-crypt/libsecret
+               dev-libs/glib:2
+       )
        iconv? ( virtual/libiconv )
+       pcre? ( dev-libs/libpcre2:= )
+       perl? ( dev-lang/perl:=[-build(-)] )
+       tk? ( dev-lang/tk:= )
 "
-
-RDEPEND="${DEPEND}
+RDEPEND="
+       ${DEPEND}
        gpg? ( app-crypt/gnupg )
        perl? (
                dev-perl/Error
@@ -120,12 +127,10 @@ BDEPEND="
 
 # Live ebuild builds man pages and HTML docs, additionally
 if [[ ${PV} == *9999 ]]; then
-       BDEPEND="${BDEPEND}
-               app-text/asciidoc"
+       BDEPEND+=" app-text/asciidoc"
 fi
 
 SITEFILE="50${PN}-gentoo.el"
-S="${WORKDIR}/${MY_P}"
 
 REQUIRED_USE="
        cgi? ( perl )
@@ -140,8 +145,8 @@ REQUIRED_USE="
 RESTRICT="!test? ( test )"
 
 PATCHES=(
-       # bug #350330 - automagic CVS when we don't want it is bad.
-       "${FILESDIR}"/git-2.33.0_rc0-optional-cvs.patch
+       # Avoid automagic CVS, bug #350330
+       "${FILESDIR}"/git-2.37.0_rc1-optional-cvs.patch
 
        # Make submodule output quiet
        "${FILESDIR}"/git-2.21.0-quiet-submodules-testcase.patch
@@ -151,7 +156,7 @@ pkg_setup() {
        if use subversion && has_version "dev-vcs/subversion[dso]" ; then
                ewarn "Per Gentoo bugs #223747, #238586, when subversion is 
built"
                ewarn "with USE=dso, there may be weird crashes in git-svn. You"
-               ewarn "have been warned."
+               ewarn "have been warned!"
        fi
 
        if use perforce ; then
@@ -166,20 +171,20 @@ exportmakeopts() {
 
        myopts=(
                ASCIIDOC_NO_ROFF=YesPlease
-               $(usex cvs '' NO_CVS=YesPlease)
-               $(usex elibc_musl NO_REGEX=YesPlease '')
-               $(usex iconv '' NO_ICONV=YesPlease)
-               $(usex nls '' NO_GETTEXT=YesPlease)
+
                $(usex perl 'INSTALLDIRS=vendor 
NO_PERL_CPAN_FALLBACKS=YesPlease' NO_PERL=YesPlease)
-               $(usex perforce '' NO_PYTHON=YesPlease)
-               $(usex subversion '' NO_SVN_TESTS=YesPlease)
-               $(usex tk '' NO_TCLTK=YesPlease)
+
+               $(usev elibc_musl NO_REGEX=YesPlease)
+               $(usev !cvs NO_CVS=YesPlease)
+               $(usev !iconv NO_ICONV=YesPlease)
+               $(usev !nls NO_GETTEXT=YesPlease)
+               $(usev !perforce NO_PYTHON=YesPlease)
+               $(usev !subversion NO_SVN_TESTS=YesPlease)
+               $(usev !tk NO_TCLTK=YesPlease)
        )
 
        if use blksha1 ; then
                myopts+=( BLK_SHA1=YesPlease )
-       elif use ppcsha1 ; then
-               myopts+=( PPC_SHA1=YesPlease )
        fi
 
        if use curl ; then
@@ -188,7 +193,7 @@ exportmakeopts() {
                myopts+=( NO_CURL=YesPlease )
        fi
 
-       # broken assumptions, because of static build system ...
+       # Broken assumptions because of static build system
        myopts+=(
                NO_FINK=YesPlease
                NO_DARWIN_PORTS=YesPlease
@@ -200,26 +205,26 @@ exportmakeopts() {
                NO_EXTERNAL_GREP=
        )
 
-       # can't define this to null, since the entire makefile depends on it
+       # Can't define this to null, since the entire makefile depends on it
        sed -i -e '/\/usr\/local/s/BASIC_/#BASIC_/' Makefile || die
 
        if use pcre; then
                myopts+=( USE_LIBPCRE2=YesPlease )
                extlibs+=( -lpcre2-8 )
        fi
+
        if [[ ${CHOST} == *-solaris* ]]; then
                myopts+=(
                        NEEDS_LIBICONV=YesPlease
                        HAVE_CLOCK_MONOTONIC=1
                )
-               if grep -Fq getdelim "${EROOT}"/usr/include/stdio.h ; then
+
+               if grep -Fq getdelim "${ESYSROOT}"/usr/include/stdio.h ; then
                        myopts+=( HAVE_GETDELIM=1 )
                fi
        fi
 
-       if has_version '>=app-text/asciidoc-8.0' ; then
-               myopts+=( ASCIIDOC8=YesPlease )
-       fi
+       myopts+=( ASCIIDOC8=YesPlease )
 
        export MY_MAKEOPTS="${myopts[@]}"
        export EXTLIBS="${extlibs[@]}"
@@ -228,8 +233,10 @@ exportmakeopts() {
 src_unpack() {
        if [[ ${PV} != *9999 ]] ; then
                unpack ${MY_P}.tar.${SRC_URI_SUFFIX}
+
                cd "${S}" || die
                unpack ${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
+
                if use doc ; then
                        pushd "${S}"/Documentation &>/dev/null || die
                        unpack ${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
@@ -237,14 +244,14 @@ src_unpack() {
                fi
        else
                git-r3_src_unpack
-               #cp "${FILESDIR}"/GIT-VERSION-GEN .
+               #cp "${FILESDIR}"/GIT-VERSION-GEN . || die
        fi
 
 }
 
 src_prepare() {
-       # add experimental patches to improve mediawiki support
-       # see patches for origin
+       # Add experimental patches to improve mediawiki support,
+       # see patches for origin.
        if use mediawiki-experimental ; then
                PATCHES+=(
                        "${FILESDIR}"/git-2.7.0-mediawiki-namespaces.patch
@@ -253,6 +260,14 @@ src_prepare() {
                )
        fi
 
+       if ! use safe-directory ; then
+               # This patch neuters the "safe directory" detection.
+               # bugs #838271, #838223
+               PATCHES+=(
+                       "${FILESDIR}"/git-2.37.2-unsafe-directory.patch
+               )
+       fi
+
        default
 
        if use prefix ; then
@@ -278,21 +293,37 @@ git_emake() {
        # bug #320647: PYTHON_PATH
        local PYTHON_PATH=""
        use perforce && PYTHON_PATH="${PYTHON}"
-       emake ${MY_MAKEOPTS} \
-               prefix="${EPREFIX}"/usr \
-               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html \
-               perllibdir="$(use perl && perl_get_raw_vendorlib)" \
-               sysconfdir="${EPREFIX}"/etc \
-               GIT_TEST_OPTS="--no-color" \
-               OPTAR="$(tc-getAR)" \
-               OPTCC="$(tc-getCC)" \
-               OPTCFLAGS="${CFLAGS}" \
-               OPTLDFLAGS="${LDFLAGS}" \
-               PERL_PATH="${EPREFIX}/usr/bin/perl" \
-               PERL_MM_OPT="" \
-               PYTHON_PATH="${PYTHON_PATH}" \
-               V=1 \
+
+       local mymakeargs=(
+               ${MY_MAKEOPTS}
+
+               prefix="${EPREFIX}"/usr
+               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html
+               perllibdir="$(use perl && perl_get_raw_vendorlib)"
+               sysconfdir="${EPREFIX}"/etc
+
+               CC="$(tc-getCC)"
+               CFLAGS="${CFLAGS}"
+               PKG_CONFIG="$(tc-getPKG_CONFIG)"
+
+               # TODO: --verbose?
+               GIT_TEST_OPTS="--no-color"
+
+               OPTAR="$(tc-getAR)"
+               OPTCC="$(tc-getCC)"
+               OPTCFLAGS="${CFLAGS}"
+               OPTLDFLAGS="${LDFLAGS}"
+
+               PERL_PATH="${EPREFIX}/usr/bin/perl"
+               PERL_MM_OPT=""
+
+               PYTHON_PATH="${PYTHON_PATH}"
+
+               V=1
                "$@"
+       )
+
+       emake "${mymakeargs[@]}"
 }
 
 src_configure() {
@@ -300,58 +331,163 @@ src_configure() {
 }
 
 src_compile() {
-       git_emake || die "emake failed"
+       git_emake
 
        if use perl && use cgi ; then
-               git_emake gitweb || die "emake gitweb (cgi) failed"
+               git_emake gitweb
        fi
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
-               pushd contrib/credential/osxkeychain &>/dev/null || die
-               git_emake CC=$(tc-getCC) CFLAGS="${CFLAGS}" \
-                       || die "emake credential-osxkeychain"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/osxkeychain
        fi
 
        pushd Documentation &>/dev/null || die
        if [[ ${PV} == *9999 ]] ; then
-               git_emake man || die "emake man failed"
+               git_emake man
                if use doc ; then
-                       git_emake info html || die "emake info html failed"
+                       git_emake info html
                fi
        else
                if use doc ; then
-                       git_emake info || die "emake info html failed"
+                       git_emake info
                fi
        fi
        popd &>/dev/null || die
 
        if use gnome-keyring ; then
-               pushd contrib/credential/libsecret &>/dev/null || die
-               git_emake CC="$(tc-getCC)" CFLAGS="${CFLAGS}" 
PKG_CONFIG="$(tc-getPKG_CONFIG)"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/libsecret
        fi
 
        pushd contrib/subtree &>/dev/null || die
-       git_emake git-subtree || die
+       git_emake git-subtree
        # git-subtree.1 requires the full USE=doc dependency stack
        use doc && git_emake git-subtree.html git-subtree.1
        popd &>/dev/null || die
 
-       pushd contrib/diff-highlight &>/dev/null || die
-       git_emake || die
-       popd &>/dev/null || die
+       git_emake -C contrib/diff-highlight
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake || die
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git
+       fi
+}
+
+src_test() {
+       local disabled=(
+               # We make safe-directory optional
+               t0033-safe-directory.sh
+       )
+
+       local tests_cvs=(
+               t9200-git-cvsexportcommit.sh
+               t9400-git-cvsserver-server.sh
+               t9401-git-cvsserver-crlf.sh
+               t9402-git-cvsserver-refs.sh
+               t9600-cvsimport.sh
+               t9601-cvsimport-vendor-branch.sh
+               t9602-cvsimport-branches-tags.sh
+               t9603-cvsimport-patchsets.sh
+               t9604-cvsimport-timestamps.sh
+       )
 
+       local tests_perl=(
+               t3701-add-interactive.sh
+               t5502-quickfetch.sh
+               t5512-ls-remote.sh
+               t5520-pull.sh
+               t7106-reset-unborn-branch.sh
+               t7501-commit.sh
+       )
+       # Bug #225601 - t0004 is not suitable for root perm
+       # Bug #219839 - t1004 is not suitable for root perm
+       # t0001-init.sh - check for init notices EPERM*  fails
+       local tests_nonroot=(
+               t0001-init.sh
+               t0004-unwritable.sh
+               t0070-fundamental.sh
+               t1004-read-tree-m-u-wf.sh
+               t3700-add.sh
+               t7300-clean.sh
+       )
+       # t9100 still fails with symlinks in SVN 1.7
+       local test_svn=( t9100-git-svn-basic.sh )
+
+       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
+       if ! has_version app-arch/unzip ; then
+               einfo "Disabling tar-tree tests"
+               disabled+=( t5000-tar-tree.sh )
        fi
+
+       local cvs=0
+       use cvs && let cvs=${cvs}+1
+       if [[ ${EUID} -eq 0 ]] ; then
+               if [[ ${cvs} -eq 1 ]] ; then
+                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
+                       ewarn "You should retest with FEATURES=userpriv!"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+               einfo "Skipping other tests that require being non-root"
+               disabled+=( ${tests_nonroot[@]} )
+       else
+               if [[ ${cvs} -gt 0 ]] && has_version dev-vcs/cvs ; then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -gt 1 ]] && has_version "dev-vcs/cvs[server]" ; 
then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -lt 3 ]] ; then
+                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+       fi
+
+       if ! use perl ; then
+               einfo "Disabling tests that need Perl"
+               disabled+=( ${tests_perl[@]} )
+       fi
+
+       einfo "Disabling tests that fail with SVN 1.7"
+       disabled+=( ${test_svn[@]} )
+
+       # Reset all previously disabled tests
+       pushd t &>/dev/null || die
+       local i
+       for i in *.sh.DISABLED ; do
+               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
+       done
+       einfo "Disabled tests:"
+       for i in ${disabled[@]} ; do
+               if [[ -f "${i}" ]] ; then
+                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
+               fi
+       done
+
+       # Avoid the test system removing the results because we want them 
ourselves
+       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
+
+       # Clean old results first, must always run
+       nonfatal git_emake clean
+       popd &>/dev/null || die
+
+       # Now run the tests, keep going if we hit an error, and don't terminate 
on
+       # failure
+       local rc
+       einfo "Start test run"
+       #MAKEOPTS=-j1
+       nonfatal git_emake --keep-going test
+       rc=$?
+
+       # Display nice results, now print the results
+       pushd t &>/dev/null || die
+       nonfatal git_emake aggregate-results
+
+       # And bail if there was a problem
+       [[ ${rc} -eq 0 ]] || die "Tests failed. Please file a bug!"
 }
 
 src_install() {
-       git_emake DESTDIR="${D}" install || die "make install failed"
+       git_emake DESTDIR="${D}" install
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
                dobin contrib/credential/osxkeychain/git-credential-osxkeychain
@@ -391,19 +527,17 @@ src_install() {
 
        # git-subtree
        pushd contrib/subtree &>/dev/null || die
-       git_emake DESTDIR="${D}" install || die "Failed to emake install for 
git-subtree"
+       git_emake DESTDIR="${D}" install
        if use doc ; then
                # Do not move git subtree install-man outside USE=doc!
-               git_emake DESTDIR="${D}" install-man install-html || die 
"Failed to emake install-html install-man for git-subtree"
+               git_emake DESTDIR="${D}" install-man install-html
        fi
        newdoc README README.git-subtree
        dodoc git-subtree.txt
        popd &>/dev/null || die
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake DESTDIR="${D}" install
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git DESTDIR="${D}" install
        fi
 
        # diff-highlight
@@ -453,10 +587,7 @@ src_install() {
        )
        local i
        for i in "${contrib_objects[@]}" ; do
-               cp -rf \
-                       "${S}"/contrib/${i} \
-                       "${ED}"/usr/share/${PN}/contrib \
-                       || die "Failed contrib ${i}"
+               cp -rf "${S}"/contrib/${i} "${ED}"/usr/share/${PN}/contrib || 
die "Failed contrib ${i}"
        done
 
        if use perl && use cgi ; then
@@ -493,8 +624,7 @@ src_install() {
        if ! use prefix ; then
                newinitd "${FILESDIR}"/git-daemon-r2.initd git-daemon
                newconfd "${FILESDIR}"/git-daemon.confd git-daemon
-               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" \
-                       "[email protected]"
+               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" 
"[email protected]"
                systemd_dounit "${FILESDIR}/git-daemon.socket"
        fi
 
@@ -511,130 +641,17 @@ src_install() {
        plocale_for_each_disabled_locale rm_loc
 }
 
-src_test() {
-       local disabled=()
-       local tests_cvs=(
-               t9200-git-cvsexportcommit.sh
-               t9400-git-cvsserver-server.sh
-               t9401-git-cvsserver-crlf.sh
-               t9402-git-cvsserver-refs.sh
-               t9600-cvsimport.sh
-               t9601-cvsimport-vendor-branch.sh
-               t9602-cvsimport-branches-tags.sh
-               t9603-cvsimport-patchsets.sh
-               t9604-cvsimport-timestamps.sh
-       )
-       local tests_perl=(
-               t3701-add-interactive.sh
-               t5502-quickfetch.sh
-               t5512-ls-remote.sh
-               t5520-pull.sh
-               t7106-reset-unborn-branch.sh
-               t7501-commit.sh
-       )
-       # Bug #225601 - t0004 is not suitable for root perm
-       # Bug #219839 - t1004 is not suitable for root perm
-       # t0001-init.sh - check for init notices EPERM*  fails
-       local tests_nonroot=(
-               t0001-init.sh
-               t0004-unwritable.sh
-               t0070-fundamental.sh
-               t1004-read-tree-m-u-wf.sh
-               t3700-add.sh
-               t7300-clean.sh
-       )
-       # t9100 still fails with symlinks in SVN 1.7
-       local test_svn=( t9100-git-svn-basic.sh )
-
-       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
-       if ! has_version app-arch/unzip ; then
-               einfo "Disabling tar-tree tests"
-               disabled+=( t5000-tar-tree.sh )
-       fi
-
-       local cvs=0
-       use cvs && let cvs=${cvs}+1
-       if [[ ${EUID} -eq 0 ]] ; then
-               if [[ ${cvs} -eq 1 ]] ; then
-                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
-                       ewarn "You should retest with FEATURES=userpriv!"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-               einfo "Skipping other tests that require being non-root"
-               disabled+=( ${tests_nonroot[@]} )
-       else
-               [[ ${cvs} -gt 0 ]] && \
-                       has_version dev-vcs/cvs && \
-                       let cvs=${cvs}+1
-               [[ ${cvs} -gt 1 ]] && \
-                       has_version "dev-vcs/cvs[server]" && \
-                       let cvs=${cvs}+1
-               if [[ ${cvs} -lt 3 ]] ; then
-                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-       fi
-
-       if ! use perl ; then
-               einfo "Disabling tests that need Perl"
-               disabled+=( ${tests_perl[@]} )
+pkg_postinst() {
+       if [[ -z ${REPLACING_VERSIONS} ]] ; then
+               elog "Please read /usr/share/bash-completion/completions/git 
for Git bash command"
+               elog "completion."
+               elog "Please read /usr/share/git/git-prompt.sh for Git bash 
prompt"
+               elog "Note that the prompt bash code is now in that separate 
script"
        fi
 
-       einfo "Disabling tests that fail with SVN 1.7"
-       disabled+=( ${test_svn[@]} )
+       optfeature_header "Some scripts require additional dependencies:"
+       optfeature git-quiltimport dev-util/quilt
+       optfeature git-instaweb www-servers/lighttpd www-servers/apache 
www-servers/nginx
 
-       # Reset all previously disabled tests
-       pushd t &>/dev/null || die
-       local i
-       for i in *.sh.DISABLED ; do
-               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
-       done
-       einfo "Disabled tests:"
-       for i in ${disabled[@]} ; do
-               if [[ -f "${i}" ]] ; then
-                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
-               fi
-       done
-
-       # Avoid the test system removing the results because we want them 
ourselves
-       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
-
-       # Clean old results first, must always run
-       nonfatal git_emake clean
-       popd &>/dev/null || die
-
-       # Now run the tests, keep going if we hit an error, and don't terminate 
on
-       # failure
-       local rc
-       einfo "Start test run"
-       #MAKEOPTS=-j1
-       nonfatal git_emake --keep-going test
-       rc=$?
-
-       # Display nice results, now print the results
-       pushd t &>/dev/null || die
-       nonfatal git_emake aggregate-results
-
-       # And bail if there was a problem
-       [[ ${rc} -eq 0 ]] || die "tests failed. Please file a bug."
-}
-
-showpkgdeps() {
-       local pkg=$1
-       shift
-       elog "  $(printf "%-17s:" ${pkg}) ${@}"
-}
-
-pkg_postinst() {
-       elog "Please read /usr/share/bash-completion/completions/git for Git 
bash command"
-       elog "completion."
-       elog "Please read /usr/share/git/git-prompt.sh for Git bash prompt"
-       elog "Note that the prompt bash code is now in that separate script"
-       elog "These additional scripts need some dependencies:"
-       echo
-       showpkgdeps git-quiltimport "dev-util/quilt"
-       showpkgdeps git-instaweb \
-               "|| ( www-servers/lighttpd www-servers/apache www-servers/nginx 
)"
-       echo
        use mediawiki-experimental && ewarn "Using experimental git-mediawiki 
patches. The stability of cloned wiki filesystems is not guaranteed."
 }

diff --git a/dev-vcs/git/git-9999-r3.ebuild b/dev-vcs/git/git-9999-r3.ebuild
index 5b04055c6684..f68fb68b1f50 100644
--- a/dev-vcs/git/git-9999-r3.ebuild
+++ b/dev-vcs/git/git-9999-r3.ebuild
@@ -8,12 +8,14 @@ GENTOO_DEPEND_ON_PERL=no
 # bug #329479: git-remote-testgit is not multiple-version aware
 PYTHON_COMPAT=( python3_{8..10} )
 
-inherit toolchain-funcs perl-module bash-completion-r1 plocale 
python-single-r1 systemd
+inherit toolchain-funcs perl-module bash-completion-r1 optfeature plocale 
python-single-r1 systemd
 
 PLOCALES="bg ca de es fr is it ko pt_PT ru sv vi zh_CN"
+
 if [[ ${PV} == *9999 ]]; then
-       inherit git-r3
        EGIT_REPO_URI="https://git.kernel.org/pub/scm/git/git.git";
+
+       inherit git-r3
        # Please ensure that all _four_ 9999 ebuilds get updated; they track 
the 4 upstream branches.
        # See https://git-scm.com/docs/gitworkflows#_graduation
        # In order of stability:
@@ -21,7 +23,7 @@ if [[ ${PV} == *9999 ]]; then
        # 9999-r1: master
        # 9999-r2: next
        # 9999-r3: seen
-       case "${PVR}" in
+       case ${PVR} in
                9999) EGIT_BRANCH=maint ;;
                9999-r1) EGIT_BRANCH=master ;;
                9999-r2) EGIT_BRANCH=next;;
@@ -34,44 +36,49 @@ MY_P="${PN}-${MY_PV}"
 
 DOC_VER="${MY_PV}"
 
-DESCRIPTION="stupid content tracker: distributed VCS designed for speed and 
efficiency"
+DESCRIPTION="Stupid content tracker: distributed VCS designed for speed and 
efficiency"
 HOMEPAGE="https://www.git-scm.com/";
+
 if [[ ${PV} != *9999 ]]; then
        SRC_URI_SUFFIX="xz"
        SRC_URI_KORG="https://www.kernel.org/pub/software/scm/git";
-       [[ "${PV/rc}" != "${PV}" ]] && SRC_URI_KORG+='/testing'
-       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}
-                       
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       doc? (
-                       
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       )"
-       [[ "${PV}" == *_rc* ]] || \
-       KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos 
~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+
+       [[ ${PV/rc} != ${PV} ]] && SRC_URI_KORG+='/testing'
+
+       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" 
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" doc? ( 
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX} )"
+
+       if [[ ${PV} != *_rc* ]] ; then
+               KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k 
~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux 
~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+       fi
 fi
 
+S="${WORKDIR}"/${MY_P}
+
 LICENSE="GPL-2"
 SLOT="0"
-IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +ppcsha1 selinux subversion tk 
+webdav xinetd cvs test"
+IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +safe-directory selinux 
subversion tk +webdav xinetd cvs test"
 
 # Common to both DEPEND and RDEPEND
 DEPEND="
-       gnome-keyring? (
-               app-crypt/libsecret
-               dev-libs/glib:2
-       )
-       dev-libs/openssl:0=
+       dev-libs/openssl:=
        sys-libs/zlib
-       pcre? ( dev-libs/libpcre2:= )
-       perl? ( dev-lang/perl:=[-build(-)] )
-       tk? ( dev-lang/tk:0= )
        curl? (
                net-misc/curl
                webdav? ( dev-libs/expat )
        )
+       gnome-keyring? (
+               app-crypt/libsecret
+               dev-libs/glib:2
+       )
        iconv? ( virtual/libiconv )
+       pcre? ( dev-libs/libpcre2:= )
+       perl? ( dev-lang/perl:=[-build(-)] )
+       tk? ( dev-lang/tk:= )
 "
-
-RDEPEND="${DEPEND}
+RDEPEND="
+       ${DEPEND}
        gpg? ( app-crypt/gnupg )
        perl? (
                dev-perl/Error
@@ -120,12 +127,10 @@ BDEPEND="
 
 # Live ebuild builds man pages and HTML docs, additionally
 if [[ ${PV} == *9999 ]]; then
-       BDEPEND="${BDEPEND}
-               app-text/asciidoc"
+       BDEPEND+=" app-text/asciidoc"
 fi
 
 SITEFILE="50${PN}-gentoo.el"
-S="${WORKDIR}/${MY_P}"
 
 REQUIRED_USE="
        cgi? ( perl )
@@ -140,8 +145,8 @@ REQUIRED_USE="
 RESTRICT="!test? ( test )"
 
 PATCHES=(
-       # bug #350330 - automagic CVS when we don't want it is bad.
-       "${FILESDIR}"/git-2.33.0_rc0-optional-cvs.patch
+       # Avoid automagic CVS, bug #350330
+       "${FILESDIR}"/git-2.37.0_rc1-optional-cvs.patch
 
        # Make submodule output quiet
        "${FILESDIR}"/git-2.21.0-quiet-submodules-testcase.patch
@@ -151,7 +156,7 @@ pkg_setup() {
        if use subversion && has_version "dev-vcs/subversion[dso]" ; then
                ewarn "Per Gentoo bugs #223747, #238586, when subversion is 
built"
                ewarn "with USE=dso, there may be weird crashes in git-svn. You"
-               ewarn "have been warned."
+               ewarn "have been warned!"
        fi
 
        if use perforce ; then
@@ -166,20 +171,20 @@ exportmakeopts() {
 
        myopts=(
                ASCIIDOC_NO_ROFF=YesPlease
-               $(usex cvs '' NO_CVS=YesPlease)
-               $(usex elibc_musl NO_REGEX=YesPlease '')
-               $(usex iconv '' NO_ICONV=YesPlease)
-               $(usex nls '' NO_GETTEXT=YesPlease)
+
                $(usex perl 'INSTALLDIRS=vendor 
NO_PERL_CPAN_FALLBACKS=YesPlease' NO_PERL=YesPlease)
-               $(usex perforce '' NO_PYTHON=YesPlease)
-               $(usex subversion '' NO_SVN_TESTS=YesPlease)
-               $(usex tk '' NO_TCLTK=YesPlease)
+
+               $(usev elibc_musl NO_REGEX=YesPlease)
+               $(usev !cvs NO_CVS=YesPlease)
+               $(usev !iconv NO_ICONV=YesPlease)
+               $(usev !nls NO_GETTEXT=YesPlease)
+               $(usev !perforce NO_PYTHON=YesPlease)
+               $(usev !subversion NO_SVN_TESTS=YesPlease)
+               $(usev !tk NO_TCLTK=YesPlease)
        )
 
        if use blksha1 ; then
                myopts+=( BLK_SHA1=YesPlease )
-       elif use ppcsha1 ; then
-               myopts+=( PPC_SHA1=YesPlease )
        fi
 
        if use curl ; then
@@ -188,7 +193,7 @@ exportmakeopts() {
                myopts+=( NO_CURL=YesPlease )
        fi
 
-       # broken assumptions, because of static build system ...
+       # Broken assumptions because of static build system
        myopts+=(
                NO_FINK=YesPlease
                NO_DARWIN_PORTS=YesPlease
@@ -200,26 +205,26 @@ exportmakeopts() {
                NO_EXTERNAL_GREP=
        )
 
-       # can't define this to null, since the entire makefile depends on it
+       # Can't define this to null, since the entire makefile depends on it
        sed -i -e '/\/usr\/local/s/BASIC_/#BASIC_/' Makefile || die
 
        if use pcre; then
                myopts+=( USE_LIBPCRE2=YesPlease )
                extlibs+=( -lpcre2-8 )
        fi
+
        if [[ ${CHOST} == *-solaris* ]]; then
                myopts+=(
                        NEEDS_LIBICONV=YesPlease
                        HAVE_CLOCK_MONOTONIC=1
                )
-               if grep -Fq getdelim "${EROOT}"/usr/include/stdio.h ; then
+
+               if grep -Fq getdelim "${ESYSROOT}"/usr/include/stdio.h ; then
                        myopts+=( HAVE_GETDELIM=1 )
                fi
        fi
 
-       if has_version '>=app-text/asciidoc-8.0' ; then
-               myopts+=( ASCIIDOC8=YesPlease )
-       fi
+       myopts+=( ASCIIDOC8=YesPlease )
 
        export MY_MAKEOPTS="${myopts[@]}"
        export EXTLIBS="${extlibs[@]}"
@@ -228,8 +233,10 @@ exportmakeopts() {
 src_unpack() {
        if [[ ${PV} != *9999 ]] ; then
                unpack ${MY_P}.tar.${SRC_URI_SUFFIX}
+
                cd "${S}" || die
                unpack ${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
+
                if use doc ; then
                        pushd "${S}"/Documentation &>/dev/null || die
                        unpack ${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
@@ -237,14 +244,14 @@ src_unpack() {
                fi
        else
                git-r3_src_unpack
-               #cp "${FILESDIR}"/GIT-VERSION-GEN .
+               #cp "${FILESDIR}"/GIT-VERSION-GEN . || die
        fi
 
 }
 
 src_prepare() {
-       # add experimental patches to improve mediawiki support
-       # see patches for origin
+       # Add experimental patches to improve mediawiki support,
+       # see patches for origin.
        if use mediawiki-experimental ; then
                PATCHES+=(
                        "${FILESDIR}"/git-2.7.0-mediawiki-namespaces.patch
@@ -253,6 +260,14 @@ src_prepare() {
                )
        fi
 
+       if ! use safe-directory ; then
+               # This patch neuters the "safe directory" detection.
+               # bugs #838271, #838223
+               PATCHES+=(
+                       "${FILESDIR}"/git-2.37.2-unsafe-directory.patch
+               )
+       fi
+
        default
 
        if use prefix ; then
@@ -278,21 +293,37 @@ git_emake() {
        # bug #320647: PYTHON_PATH
        local PYTHON_PATH=""
        use perforce && PYTHON_PATH="${PYTHON}"
-       emake ${MY_MAKEOPTS} \
-               prefix="${EPREFIX}"/usr \
-               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html \
-               perllibdir="$(use perl && perl_get_raw_vendorlib)" \
-               sysconfdir="${EPREFIX}"/etc \
-               GIT_TEST_OPTS="--no-color" \
-               OPTAR="$(tc-getAR)" \
-               OPTCC="$(tc-getCC)" \
-               OPTCFLAGS="${CFLAGS}" \
-               OPTLDFLAGS="${LDFLAGS}" \
-               PERL_PATH="${EPREFIX}/usr/bin/perl" \
-               PERL_MM_OPT="" \
-               PYTHON_PATH="${PYTHON_PATH}" \
-               V=1 \
+
+       local mymakeargs=(
+               ${MY_MAKEOPTS}
+
+               prefix="${EPREFIX}"/usr
+               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html
+               perllibdir="$(use perl && perl_get_raw_vendorlib)"
+               sysconfdir="${EPREFIX}"/etc
+
+               CC="$(tc-getCC)"
+               CFLAGS="${CFLAGS}"
+               PKG_CONFIG="$(tc-getPKG_CONFIG)"
+
+               # TODO: --verbose?
+               GIT_TEST_OPTS="--no-color"
+
+               OPTAR="$(tc-getAR)"
+               OPTCC="$(tc-getCC)"
+               OPTCFLAGS="${CFLAGS}"
+               OPTLDFLAGS="${LDFLAGS}"
+
+               PERL_PATH="${EPREFIX}/usr/bin/perl"
+               PERL_MM_OPT=""
+
+               PYTHON_PATH="${PYTHON_PATH}"
+
+               V=1
                "$@"
+       )
+
+       emake "${mymakeargs[@]}"
 }
 
 src_configure() {
@@ -300,58 +331,163 @@ src_configure() {
 }
 
 src_compile() {
-       git_emake || die "emake failed"
+       git_emake
 
        if use perl && use cgi ; then
-               git_emake gitweb || die "emake gitweb (cgi) failed"
+               git_emake gitweb
        fi
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
-               pushd contrib/credential/osxkeychain &>/dev/null || die
-               git_emake CC=$(tc-getCC) CFLAGS="${CFLAGS}" \
-                       || die "emake credential-osxkeychain"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/osxkeychain
        fi
 
        pushd Documentation &>/dev/null || die
        if [[ ${PV} == *9999 ]] ; then
-               git_emake man || die "emake man failed"
+               git_emake man
                if use doc ; then
-                       git_emake info html || die "emake info html failed"
+                       git_emake info html
                fi
        else
                if use doc ; then
-                       git_emake info || die "emake info html failed"
+                       git_emake info
                fi
        fi
        popd &>/dev/null || die
 
        if use gnome-keyring ; then
-               pushd contrib/credential/libsecret &>/dev/null || die
-               git_emake CC="$(tc-getCC)" CFLAGS="${CFLAGS}" 
PKG_CONFIG="$(tc-getPKG_CONFIG)"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/libsecret
        fi
 
        pushd contrib/subtree &>/dev/null || die
-       git_emake git-subtree || die
+       git_emake git-subtree
        # git-subtree.1 requires the full USE=doc dependency stack
        use doc && git_emake git-subtree.html git-subtree.1
        popd &>/dev/null || die
 
-       pushd contrib/diff-highlight &>/dev/null || die
-       git_emake || die
-       popd &>/dev/null || die
+       git_emake -C contrib/diff-highlight
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake || die
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git
+       fi
+}
+
+src_test() {
+       local disabled=(
+               # We make safe-directory optional
+               t0033-safe-directory.sh
+       )
+
+       local tests_cvs=(
+               t9200-git-cvsexportcommit.sh
+               t9400-git-cvsserver-server.sh
+               t9401-git-cvsserver-crlf.sh
+               t9402-git-cvsserver-refs.sh
+               t9600-cvsimport.sh
+               t9601-cvsimport-vendor-branch.sh
+               t9602-cvsimport-branches-tags.sh
+               t9603-cvsimport-patchsets.sh
+               t9604-cvsimport-timestamps.sh
+       )
 
+       local tests_perl=(
+               t3701-add-interactive.sh
+               t5502-quickfetch.sh
+               t5512-ls-remote.sh
+               t5520-pull.sh
+               t7106-reset-unborn-branch.sh
+               t7501-commit.sh
+       )
+       # Bug #225601 - t0004 is not suitable for root perm
+       # Bug #219839 - t1004 is not suitable for root perm
+       # t0001-init.sh - check for init notices EPERM*  fails
+       local tests_nonroot=(
+               t0001-init.sh
+               t0004-unwritable.sh
+               t0070-fundamental.sh
+               t1004-read-tree-m-u-wf.sh
+               t3700-add.sh
+               t7300-clean.sh
+       )
+       # t9100 still fails with symlinks in SVN 1.7
+       local test_svn=( t9100-git-svn-basic.sh )
+
+       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
+       if ! has_version app-arch/unzip ; then
+               einfo "Disabling tar-tree tests"
+               disabled+=( t5000-tar-tree.sh )
        fi
+
+       local cvs=0
+       use cvs && let cvs=${cvs}+1
+       if [[ ${EUID} -eq 0 ]] ; then
+               if [[ ${cvs} -eq 1 ]] ; then
+                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
+                       ewarn "You should retest with FEATURES=userpriv!"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+               einfo "Skipping other tests that require being non-root"
+               disabled+=( ${tests_nonroot[@]} )
+       else
+               if [[ ${cvs} -gt 0 ]] && has_version dev-vcs/cvs ; then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -gt 1 ]] && has_version "dev-vcs/cvs[server]" ; 
then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -lt 3 ]] ; then
+                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+       fi
+
+       if ! use perl ; then
+               einfo "Disabling tests that need Perl"
+               disabled+=( ${tests_perl[@]} )
+       fi
+
+       einfo "Disabling tests that fail with SVN 1.7"
+       disabled+=( ${test_svn[@]} )
+
+       # Reset all previously disabled tests
+       pushd t &>/dev/null || die
+       local i
+       for i in *.sh.DISABLED ; do
+               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
+       done
+       einfo "Disabled tests:"
+       for i in ${disabled[@]} ; do
+               if [[ -f "${i}" ]] ; then
+                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
+               fi
+       done
+
+       # Avoid the test system removing the results because we want them 
ourselves
+       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
+
+       # Clean old results first, must always run
+       nonfatal git_emake clean
+       popd &>/dev/null || die
+
+       # Now run the tests, keep going if we hit an error, and don't terminate 
on
+       # failure
+       local rc
+       einfo "Start test run"
+       #MAKEOPTS=-j1
+       nonfatal git_emake --keep-going test
+       rc=$?
+
+       # Display nice results, now print the results
+       pushd t &>/dev/null || die
+       nonfatal git_emake aggregate-results
+
+       # And bail if there was a problem
+       [[ ${rc} -eq 0 ]] || die "Tests failed. Please file a bug!"
 }
 
 src_install() {
-       git_emake DESTDIR="${D}" install || die "make install failed"
+       git_emake DESTDIR="${D}" install
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
                dobin contrib/credential/osxkeychain/git-credential-osxkeychain
@@ -391,19 +527,17 @@ src_install() {
 
        # git-subtree
        pushd contrib/subtree &>/dev/null || die
-       git_emake DESTDIR="${D}" install || die "Failed to emake install for 
git-subtree"
+       git_emake DESTDIR="${D}" install
        if use doc ; then
                # Do not move git subtree install-man outside USE=doc!
-               git_emake DESTDIR="${D}" install-man install-html || die 
"Failed to emake install-html install-man for git-subtree"
+               git_emake DESTDIR="${D}" install-man install-html
        fi
        newdoc README README.git-subtree
        dodoc git-subtree.txt
        popd &>/dev/null || die
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake DESTDIR="${D}" install
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git DESTDIR="${D}" install
        fi
 
        # diff-highlight
@@ -453,10 +587,7 @@ src_install() {
        )
        local i
        for i in "${contrib_objects[@]}" ; do
-               cp -rf \
-                       "${S}"/contrib/${i} \
-                       "${ED}"/usr/share/${PN}/contrib \
-                       || die "Failed contrib ${i}"
+               cp -rf "${S}"/contrib/${i} "${ED}"/usr/share/${PN}/contrib || 
die "Failed contrib ${i}"
        done
 
        if use perl && use cgi ; then
@@ -493,8 +624,7 @@ src_install() {
        if ! use prefix ; then
                newinitd "${FILESDIR}"/git-daemon-r2.initd git-daemon
                newconfd "${FILESDIR}"/git-daemon.confd git-daemon
-               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" \
-                       "[email protected]"
+               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" 
"[email protected]"
                systemd_dounit "${FILESDIR}/git-daemon.socket"
        fi
 
@@ -511,130 +641,17 @@ src_install() {
        plocale_for_each_disabled_locale rm_loc
 }
 
-src_test() {
-       local disabled=()
-       local tests_cvs=(
-               t9200-git-cvsexportcommit.sh
-               t9400-git-cvsserver-server.sh
-               t9401-git-cvsserver-crlf.sh
-               t9402-git-cvsserver-refs.sh
-               t9600-cvsimport.sh
-               t9601-cvsimport-vendor-branch.sh
-               t9602-cvsimport-branches-tags.sh
-               t9603-cvsimport-patchsets.sh
-               t9604-cvsimport-timestamps.sh
-       )
-       local tests_perl=(
-               t3701-add-interactive.sh
-               t5502-quickfetch.sh
-               t5512-ls-remote.sh
-               t5520-pull.sh
-               t7106-reset-unborn-branch.sh
-               t7501-commit.sh
-       )
-       # Bug #225601 - t0004 is not suitable for root perm
-       # Bug #219839 - t1004 is not suitable for root perm
-       # t0001-init.sh - check for init notices EPERM*  fails
-       local tests_nonroot=(
-               t0001-init.sh
-               t0004-unwritable.sh
-               t0070-fundamental.sh
-               t1004-read-tree-m-u-wf.sh
-               t3700-add.sh
-               t7300-clean.sh
-       )
-       # t9100 still fails with symlinks in SVN 1.7
-       local test_svn=( t9100-git-svn-basic.sh )
-
-       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
-       if ! has_version app-arch/unzip ; then
-               einfo "Disabling tar-tree tests"
-               disabled+=( t5000-tar-tree.sh )
-       fi
-
-       local cvs=0
-       use cvs && let cvs=${cvs}+1
-       if [[ ${EUID} -eq 0 ]] ; then
-               if [[ ${cvs} -eq 1 ]] ; then
-                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
-                       ewarn "You should retest with FEATURES=userpriv!"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-               einfo "Skipping other tests that require being non-root"
-               disabled+=( ${tests_nonroot[@]} )
-       else
-               [[ ${cvs} -gt 0 ]] && \
-                       has_version dev-vcs/cvs && \
-                       let cvs=${cvs}+1
-               [[ ${cvs} -gt 1 ]] && \
-                       has_version "dev-vcs/cvs[server]" && \
-                       let cvs=${cvs}+1
-               if [[ ${cvs} -lt 3 ]] ; then
-                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-       fi
-
-       if ! use perl ; then
-               einfo "Disabling tests that need Perl"
-               disabled+=( ${tests_perl[@]} )
+pkg_postinst() {
+       if [[ -z ${REPLACING_VERSIONS} ]] ; then
+               elog "Please read /usr/share/bash-completion/completions/git 
for Git bash command"
+               elog "completion."
+               elog "Please read /usr/share/git/git-prompt.sh for Git bash 
prompt"
+               elog "Note that the prompt bash code is now in that separate 
script"
        fi
 
-       einfo "Disabling tests that fail with SVN 1.7"
-       disabled+=( ${test_svn[@]} )
+       optfeature_header "Some scripts require additional dependencies:"
+       optfeature git-quiltimport dev-util/quilt
+       optfeature git-instaweb www-servers/lighttpd www-servers/apache 
www-servers/nginx
 
-       # Reset all previously disabled tests
-       pushd t &>/dev/null || die
-       local i
-       for i in *.sh.DISABLED ; do
-               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
-       done
-       einfo "Disabled tests:"
-       for i in ${disabled[@]} ; do
-               if [[ -f "${i}" ]] ; then
-                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
-               fi
-       done
-
-       # Avoid the test system removing the results because we want them 
ourselves
-       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
-
-       # Clean old results first, must always run
-       nonfatal git_emake clean
-       popd &>/dev/null || die
-
-       # Now run the tests, keep going if we hit an error, and don't terminate 
on
-       # failure
-       local rc
-       einfo "Start test run"
-       #MAKEOPTS=-j1
-       nonfatal git_emake --keep-going test
-       rc=$?
-
-       # Display nice results, now print the results
-       pushd t &>/dev/null || die
-       nonfatal git_emake aggregate-results
-
-       # And bail if there was a problem
-       [[ ${rc} -eq 0 ]] || die "tests failed. Please file a bug."
-}
-
-showpkgdeps() {
-       local pkg=$1
-       shift
-       elog "  $(printf "%-17s:" ${pkg}) ${@}"
-}
-
-pkg_postinst() {
-       elog "Please read /usr/share/bash-completion/completions/git for Git 
bash command"
-       elog "completion."
-       elog "Please read /usr/share/git/git-prompt.sh for Git bash prompt"
-       elog "Note that the prompt bash code is now in that separate script"
-       elog "These additional scripts need some dependencies:"
-       echo
-       showpkgdeps git-quiltimport "dev-util/quilt"
-       showpkgdeps git-instaweb \
-               "|| ( www-servers/lighttpd www-servers/apache www-servers/nginx 
)"
-       echo
        use mediawiki-experimental && ewarn "Using experimental git-mediawiki 
patches. The stability of cloned wiki filesystems is not guaranteed."
 }

diff --git a/dev-vcs/git/git-9999.ebuild b/dev-vcs/git/git-9999.ebuild
index 5b04055c6684..f68fb68b1f50 100644
--- a/dev-vcs/git/git-9999.ebuild
+++ b/dev-vcs/git/git-9999.ebuild
@@ -8,12 +8,14 @@ GENTOO_DEPEND_ON_PERL=no
 # bug #329479: git-remote-testgit is not multiple-version aware
 PYTHON_COMPAT=( python3_{8..10} )
 
-inherit toolchain-funcs perl-module bash-completion-r1 plocale 
python-single-r1 systemd
+inherit toolchain-funcs perl-module bash-completion-r1 optfeature plocale 
python-single-r1 systemd
 
 PLOCALES="bg ca de es fr is it ko pt_PT ru sv vi zh_CN"
+
 if [[ ${PV} == *9999 ]]; then
-       inherit git-r3
        EGIT_REPO_URI="https://git.kernel.org/pub/scm/git/git.git";
+
+       inherit git-r3
        # Please ensure that all _four_ 9999 ebuilds get updated; they track 
the 4 upstream branches.
        # See https://git-scm.com/docs/gitworkflows#_graduation
        # In order of stability:
@@ -21,7 +23,7 @@ if [[ ${PV} == *9999 ]]; then
        # 9999-r1: master
        # 9999-r2: next
        # 9999-r3: seen
-       case "${PVR}" in
+       case ${PVR} in
                9999) EGIT_BRANCH=maint ;;
                9999-r1) EGIT_BRANCH=master ;;
                9999-r2) EGIT_BRANCH=next;;
@@ -34,44 +36,49 @@ MY_P="${PN}-${MY_PV}"
 
 DOC_VER="${MY_PV}"
 
-DESCRIPTION="stupid content tracker: distributed VCS designed for speed and 
efficiency"
+DESCRIPTION="Stupid content tracker: distributed VCS designed for speed and 
efficiency"
 HOMEPAGE="https://www.git-scm.com/";
+
 if [[ ${PV} != *9999 ]]; then
        SRC_URI_SUFFIX="xz"
        SRC_URI_KORG="https://www.kernel.org/pub/software/scm/git";
-       [[ "${PV/rc}" != "${PV}" ]] && SRC_URI_KORG+='/testing'
-       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}
-                       
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       doc? (
-                       
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
-                       )"
-       [[ "${PV}" == *_rc* ]] || \
-       KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k ~mips ~ppc 
~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos 
~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+
+       [[ ${PV/rc} != ${PV} ]] && SRC_URI_KORG+='/testing'
+
+       SRC_URI="${SRC_URI_KORG}/${MY_P}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" 
${SRC_URI_KORG}/${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}"
+       SRC_URI+=" doc? ( 
${SRC_URI_KORG}/${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX} )"
+
+       if [[ ${PV} != *_rc* ]] ; then
+               KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~m68k 
~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux 
~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+       fi
 fi
 
+S="${WORKDIR}"/${MY_P}
+
 LICENSE="GPL-2"
 SLOT="0"
-IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +ppcsha1 selinux subversion tk 
+webdav xinetd cvs test"
+IUSE="+blksha1 +curl cgi doc gnome-keyring +gpg highlight +iconv mediawiki 
mediawiki-experimental +nls +pcre perforce +perl +safe-directory selinux 
subversion tk +webdav xinetd cvs test"
 
 # Common to both DEPEND and RDEPEND
 DEPEND="
-       gnome-keyring? (
-               app-crypt/libsecret
-               dev-libs/glib:2
-       )
-       dev-libs/openssl:0=
+       dev-libs/openssl:=
        sys-libs/zlib
-       pcre? ( dev-libs/libpcre2:= )
-       perl? ( dev-lang/perl:=[-build(-)] )
-       tk? ( dev-lang/tk:0= )
        curl? (
                net-misc/curl
                webdav? ( dev-libs/expat )
        )
+       gnome-keyring? (
+               app-crypt/libsecret
+               dev-libs/glib:2
+       )
        iconv? ( virtual/libiconv )
+       pcre? ( dev-libs/libpcre2:= )
+       perl? ( dev-lang/perl:=[-build(-)] )
+       tk? ( dev-lang/tk:= )
 "
-
-RDEPEND="${DEPEND}
+RDEPEND="
+       ${DEPEND}
        gpg? ( app-crypt/gnupg )
        perl? (
                dev-perl/Error
@@ -120,12 +127,10 @@ BDEPEND="
 
 # Live ebuild builds man pages and HTML docs, additionally
 if [[ ${PV} == *9999 ]]; then
-       BDEPEND="${BDEPEND}
-               app-text/asciidoc"
+       BDEPEND+=" app-text/asciidoc"
 fi
 
 SITEFILE="50${PN}-gentoo.el"
-S="${WORKDIR}/${MY_P}"
 
 REQUIRED_USE="
        cgi? ( perl )
@@ -140,8 +145,8 @@ REQUIRED_USE="
 RESTRICT="!test? ( test )"
 
 PATCHES=(
-       # bug #350330 - automagic CVS when we don't want it is bad.
-       "${FILESDIR}"/git-2.33.0_rc0-optional-cvs.patch
+       # Avoid automagic CVS, bug #350330
+       "${FILESDIR}"/git-2.37.0_rc1-optional-cvs.patch
 
        # Make submodule output quiet
        "${FILESDIR}"/git-2.21.0-quiet-submodules-testcase.patch
@@ -151,7 +156,7 @@ pkg_setup() {
        if use subversion && has_version "dev-vcs/subversion[dso]" ; then
                ewarn "Per Gentoo bugs #223747, #238586, when subversion is 
built"
                ewarn "with USE=dso, there may be weird crashes in git-svn. You"
-               ewarn "have been warned."
+               ewarn "have been warned!"
        fi
 
        if use perforce ; then
@@ -166,20 +171,20 @@ exportmakeopts() {
 
        myopts=(
                ASCIIDOC_NO_ROFF=YesPlease
-               $(usex cvs '' NO_CVS=YesPlease)
-               $(usex elibc_musl NO_REGEX=YesPlease '')
-               $(usex iconv '' NO_ICONV=YesPlease)
-               $(usex nls '' NO_GETTEXT=YesPlease)
+
                $(usex perl 'INSTALLDIRS=vendor 
NO_PERL_CPAN_FALLBACKS=YesPlease' NO_PERL=YesPlease)
-               $(usex perforce '' NO_PYTHON=YesPlease)
-               $(usex subversion '' NO_SVN_TESTS=YesPlease)
-               $(usex tk '' NO_TCLTK=YesPlease)
+
+               $(usev elibc_musl NO_REGEX=YesPlease)
+               $(usev !cvs NO_CVS=YesPlease)
+               $(usev !iconv NO_ICONV=YesPlease)
+               $(usev !nls NO_GETTEXT=YesPlease)
+               $(usev !perforce NO_PYTHON=YesPlease)
+               $(usev !subversion NO_SVN_TESTS=YesPlease)
+               $(usev !tk NO_TCLTK=YesPlease)
        )
 
        if use blksha1 ; then
                myopts+=( BLK_SHA1=YesPlease )
-       elif use ppcsha1 ; then
-               myopts+=( PPC_SHA1=YesPlease )
        fi
 
        if use curl ; then
@@ -188,7 +193,7 @@ exportmakeopts() {
                myopts+=( NO_CURL=YesPlease )
        fi
 
-       # broken assumptions, because of static build system ...
+       # Broken assumptions because of static build system
        myopts+=(
                NO_FINK=YesPlease
                NO_DARWIN_PORTS=YesPlease
@@ -200,26 +205,26 @@ exportmakeopts() {
                NO_EXTERNAL_GREP=
        )
 
-       # can't define this to null, since the entire makefile depends on it
+       # Can't define this to null, since the entire makefile depends on it
        sed -i -e '/\/usr\/local/s/BASIC_/#BASIC_/' Makefile || die
 
        if use pcre; then
                myopts+=( USE_LIBPCRE2=YesPlease )
                extlibs+=( -lpcre2-8 )
        fi
+
        if [[ ${CHOST} == *-solaris* ]]; then
                myopts+=(
                        NEEDS_LIBICONV=YesPlease
                        HAVE_CLOCK_MONOTONIC=1
                )
-               if grep -Fq getdelim "${EROOT}"/usr/include/stdio.h ; then
+
+               if grep -Fq getdelim "${ESYSROOT}"/usr/include/stdio.h ; then
                        myopts+=( HAVE_GETDELIM=1 )
                fi
        fi
 
-       if has_version '>=app-text/asciidoc-8.0' ; then
-               myopts+=( ASCIIDOC8=YesPlease )
-       fi
+       myopts+=( ASCIIDOC8=YesPlease )
 
        export MY_MAKEOPTS="${myopts[@]}"
        export EXTLIBS="${extlibs[@]}"
@@ -228,8 +233,10 @@ exportmakeopts() {
 src_unpack() {
        if [[ ${PV} != *9999 ]] ; then
                unpack ${MY_P}.tar.${SRC_URI_SUFFIX}
+
                cd "${S}" || die
                unpack ${PN}-manpages-${DOC_VER}.tar.${SRC_URI_SUFFIX}
+
                if use doc ; then
                        pushd "${S}"/Documentation &>/dev/null || die
                        unpack ${PN}-htmldocs-${DOC_VER}.tar.${SRC_URI_SUFFIX}
@@ -237,14 +244,14 @@ src_unpack() {
                fi
        else
                git-r3_src_unpack
-               #cp "${FILESDIR}"/GIT-VERSION-GEN .
+               #cp "${FILESDIR}"/GIT-VERSION-GEN . || die
        fi
 
 }
 
 src_prepare() {
-       # add experimental patches to improve mediawiki support
-       # see patches for origin
+       # Add experimental patches to improve mediawiki support,
+       # see patches for origin.
        if use mediawiki-experimental ; then
                PATCHES+=(
                        "${FILESDIR}"/git-2.7.0-mediawiki-namespaces.patch
@@ -253,6 +260,14 @@ src_prepare() {
                )
        fi
 
+       if ! use safe-directory ; then
+               # This patch neuters the "safe directory" detection.
+               # bugs #838271, #838223
+               PATCHES+=(
+                       "${FILESDIR}"/git-2.37.2-unsafe-directory.patch
+               )
+       fi
+
        default
 
        if use prefix ; then
@@ -278,21 +293,37 @@ git_emake() {
        # bug #320647: PYTHON_PATH
        local PYTHON_PATH=""
        use perforce && PYTHON_PATH="${PYTHON}"
-       emake ${MY_MAKEOPTS} \
-               prefix="${EPREFIX}"/usr \
-               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html \
-               perllibdir="$(use perl && perl_get_raw_vendorlib)" \
-               sysconfdir="${EPREFIX}"/etc \
-               GIT_TEST_OPTS="--no-color" \
-               OPTAR="$(tc-getAR)" \
-               OPTCC="$(tc-getCC)" \
-               OPTCFLAGS="${CFLAGS}" \
-               OPTLDFLAGS="${LDFLAGS}" \
-               PERL_PATH="${EPREFIX}/usr/bin/perl" \
-               PERL_MM_OPT="" \
-               PYTHON_PATH="${PYTHON_PATH}" \
-               V=1 \
+
+       local mymakeargs=(
+               ${MY_MAKEOPTS}
+
+               prefix="${EPREFIX}"/usr
+               htmldir="${EPREFIX}"/usr/share/doc/${PF}/html
+               perllibdir="$(use perl && perl_get_raw_vendorlib)"
+               sysconfdir="${EPREFIX}"/etc
+
+               CC="$(tc-getCC)"
+               CFLAGS="${CFLAGS}"
+               PKG_CONFIG="$(tc-getPKG_CONFIG)"
+
+               # TODO: --verbose?
+               GIT_TEST_OPTS="--no-color"
+
+               OPTAR="$(tc-getAR)"
+               OPTCC="$(tc-getCC)"
+               OPTCFLAGS="${CFLAGS}"
+               OPTLDFLAGS="${LDFLAGS}"
+
+               PERL_PATH="${EPREFIX}/usr/bin/perl"
+               PERL_MM_OPT=""
+
+               PYTHON_PATH="${PYTHON_PATH}"
+
+               V=1
                "$@"
+       )
+
+       emake "${mymakeargs[@]}"
 }
 
 src_configure() {
@@ -300,58 +331,163 @@ src_configure() {
 }
 
 src_compile() {
-       git_emake || die "emake failed"
+       git_emake
 
        if use perl && use cgi ; then
-               git_emake gitweb || die "emake gitweb (cgi) failed"
+               git_emake gitweb
        fi
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
-               pushd contrib/credential/osxkeychain &>/dev/null || die
-               git_emake CC=$(tc-getCC) CFLAGS="${CFLAGS}" \
-                       || die "emake credential-osxkeychain"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/osxkeychain
        fi
 
        pushd Documentation &>/dev/null || die
        if [[ ${PV} == *9999 ]] ; then
-               git_emake man || die "emake man failed"
+               git_emake man
                if use doc ; then
-                       git_emake info html || die "emake info html failed"
+                       git_emake info html
                fi
        else
                if use doc ; then
-                       git_emake info || die "emake info html failed"
+                       git_emake info
                fi
        fi
        popd &>/dev/null || die
 
        if use gnome-keyring ; then
-               pushd contrib/credential/libsecret &>/dev/null || die
-               git_emake CC="$(tc-getCC)" CFLAGS="${CFLAGS}" 
PKG_CONFIG="$(tc-getPKG_CONFIG)"
-               popd &>/dev/null || die
+               git_emake -C contrib/credential/libsecret
        fi
 
        pushd contrib/subtree &>/dev/null || die
-       git_emake git-subtree || die
+       git_emake git-subtree
        # git-subtree.1 requires the full USE=doc dependency stack
        use doc && git_emake git-subtree.html git-subtree.1
        popd &>/dev/null || die
 
-       pushd contrib/diff-highlight &>/dev/null || die
-       git_emake || die
-       popd &>/dev/null || die
+       git_emake -C contrib/diff-highlight
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake || die
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git
+       fi
+}
+
+src_test() {
+       local disabled=(
+               # We make safe-directory optional
+               t0033-safe-directory.sh
+       )
+
+       local tests_cvs=(
+               t9200-git-cvsexportcommit.sh
+               t9400-git-cvsserver-server.sh
+               t9401-git-cvsserver-crlf.sh
+               t9402-git-cvsserver-refs.sh
+               t9600-cvsimport.sh
+               t9601-cvsimport-vendor-branch.sh
+               t9602-cvsimport-branches-tags.sh
+               t9603-cvsimport-patchsets.sh
+               t9604-cvsimport-timestamps.sh
+       )
 
+       local tests_perl=(
+               t3701-add-interactive.sh
+               t5502-quickfetch.sh
+               t5512-ls-remote.sh
+               t5520-pull.sh
+               t7106-reset-unborn-branch.sh
+               t7501-commit.sh
+       )
+       # Bug #225601 - t0004 is not suitable for root perm
+       # Bug #219839 - t1004 is not suitable for root perm
+       # t0001-init.sh - check for init notices EPERM*  fails
+       local tests_nonroot=(
+               t0001-init.sh
+               t0004-unwritable.sh
+               t0070-fundamental.sh
+               t1004-read-tree-m-u-wf.sh
+               t3700-add.sh
+               t7300-clean.sh
+       )
+       # t9100 still fails with symlinks in SVN 1.7
+       local test_svn=( t9100-git-svn-basic.sh )
+
+       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
+       if ! has_version app-arch/unzip ; then
+               einfo "Disabling tar-tree tests"
+               disabled+=( t5000-tar-tree.sh )
        fi
+
+       local cvs=0
+       use cvs && let cvs=${cvs}+1
+       if [[ ${EUID} -eq 0 ]] ; then
+               if [[ ${cvs} -eq 1 ]] ; then
+                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
+                       ewarn "You should retest with FEATURES=userpriv!"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+               einfo "Skipping other tests that require being non-root"
+               disabled+=( ${tests_nonroot[@]} )
+       else
+               if [[ ${cvs} -gt 0 ]] && has_version dev-vcs/cvs ; then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -gt 1 ]] && has_version "dev-vcs/cvs[server]" ; 
then
+                       let cvs=${cvs}+1
+               fi
+
+               if [[ ${cvs} -lt 3 ]] ; then
+                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
+                       disabled+=( ${tests_cvs[@]} )
+               fi
+       fi
+
+       if ! use perl ; then
+               einfo "Disabling tests that need Perl"
+               disabled+=( ${tests_perl[@]} )
+       fi
+
+       einfo "Disabling tests that fail with SVN 1.7"
+       disabled+=( ${test_svn[@]} )
+
+       # Reset all previously disabled tests
+       pushd t &>/dev/null || die
+       local i
+       for i in *.sh.DISABLED ; do
+               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
+       done
+       einfo "Disabled tests:"
+       for i in ${disabled[@]} ; do
+               if [[ -f "${i}" ]] ; then
+                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
+               fi
+       done
+
+       # Avoid the test system removing the results because we want them 
ourselves
+       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
+
+       # Clean old results first, must always run
+       nonfatal git_emake clean
+       popd &>/dev/null || die
+
+       # Now run the tests, keep going if we hit an error, and don't terminate 
on
+       # failure
+       local rc
+       einfo "Start test run"
+       #MAKEOPTS=-j1
+       nonfatal git_emake --keep-going test
+       rc=$?
+
+       # Display nice results, now print the results
+       pushd t &>/dev/null || die
+       nonfatal git_emake aggregate-results
+
+       # And bail if there was a problem
+       [[ ${rc} -eq 0 ]] || die "Tests failed. Please file a bug!"
 }
 
 src_install() {
-       git_emake DESTDIR="${D}" install || die "make install failed"
+       git_emake DESTDIR="${D}" install
 
        if [[ ${CHOST} == *-darwin* ]] && tc-is-clang ; then
                dobin contrib/credential/osxkeychain/git-credential-osxkeychain
@@ -391,19 +527,17 @@ src_install() {
 
        # git-subtree
        pushd contrib/subtree &>/dev/null || die
-       git_emake DESTDIR="${D}" install || die "Failed to emake install for 
git-subtree"
+       git_emake DESTDIR="${D}" install
        if use doc ; then
                # Do not move git subtree install-man outside USE=doc!
-               git_emake DESTDIR="${D}" install-man install-html || die 
"Failed to emake install-html install-man for git-subtree"
+               git_emake DESTDIR="${D}" install-man install-html
        fi
        newdoc README README.git-subtree
        dodoc git-subtree.txt
        popd &>/dev/null || die
 
        if use mediawiki ; then
-               pushd contrib/mw-to-git &>/dev/null || die
-               git_emake DESTDIR="${D}" install
-               popd &>/dev/null || die
+               git_emake -C contrib/mw-to-git DESTDIR="${D}" install
        fi
 
        # diff-highlight
@@ -453,10 +587,7 @@ src_install() {
        )
        local i
        for i in "${contrib_objects[@]}" ; do
-               cp -rf \
-                       "${S}"/contrib/${i} \
-                       "${ED}"/usr/share/${PN}/contrib \
-                       || die "Failed contrib ${i}"
+               cp -rf "${S}"/contrib/${i} "${ED}"/usr/share/${PN}/contrib || 
die "Failed contrib ${i}"
        done
 
        if use perl && use cgi ; then
@@ -493,8 +624,7 @@ src_install() {
        if ! use prefix ; then
                newinitd "${FILESDIR}"/git-daemon-r2.initd git-daemon
                newconfd "${FILESDIR}"/git-daemon.confd git-daemon
-               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" \
-                       "[email protected]"
+               systemd_newunit "${FILESDIR}/git-daemon_at-r1.service" 
"[email protected]"
                systemd_dounit "${FILESDIR}/git-daemon.socket"
        fi
 
@@ -511,130 +641,17 @@ src_install() {
        plocale_for_each_disabled_locale rm_loc
 }
 
-src_test() {
-       local disabled=()
-       local tests_cvs=(
-               t9200-git-cvsexportcommit.sh
-               t9400-git-cvsserver-server.sh
-               t9401-git-cvsserver-crlf.sh
-               t9402-git-cvsserver-refs.sh
-               t9600-cvsimport.sh
-               t9601-cvsimport-vendor-branch.sh
-               t9602-cvsimport-branches-tags.sh
-               t9603-cvsimport-patchsets.sh
-               t9604-cvsimport-timestamps.sh
-       )
-       local tests_perl=(
-               t3701-add-interactive.sh
-               t5502-quickfetch.sh
-               t5512-ls-remote.sh
-               t5520-pull.sh
-               t7106-reset-unborn-branch.sh
-               t7501-commit.sh
-       )
-       # Bug #225601 - t0004 is not suitable for root perm
-       # Bug #219839 - t1004 is not suitable for root perm
-       # t0001-init.sh - check for init notices EPERM*  fails
-       local tests_nonroot=(
-               t0001-init.sh
-               t0004-unwritable.sh
-               t0070-fundamental.sh
-               t1004-read-tree-m-u-wf.sh
-               t3700-add.sh
-               t7300-clean.sh
-       )
-       # t9100 still fails with symlinks in SVN 1.7
-       local test_svn=( t9100-git-svn-basic.sh )
-
-       # Unzip is used only for the testcase code, not by any normal parts of 
Git.
-       if ! has_version app-arch/unzip ; then
-               einfo "Disabling tar-tree tests"
-               disabled+=( t5000-tar-tree.sh )
-       fi
-
-       local cvs=0
-       use cvs && let cvs=${cvs}+1
-       if [[ ${EUID} -eq 0 ]] ; then
-               if [[ ${cvs} -eq 1 ]] ; then
-                       ewarn "Skipping CVS tests because CVS does not work as 
root!"
-                       ewarn "You should retest with FEATURES=userpriv!"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-               einfo "Skipping other tests that require being non-root"
-               disabled+=( ${tests_nonroot[@]} )
-       else
-               [[ ${cvs} -gt 0 ]] && \
-                       has_version dev-vcs/cvs && \
-                       let cvs=${cvs}+1
-               [[ ${cvs} -gt 1 ]] && \
-                       has_version "dev-vcs/cvs[server]" && \
-                       let cvs=${cvs}+1
-               if [[ ${cvs} -lt 3 ]] ; then
-                       einfo "Disabling CVS tests (needs 
dev-vcs/cvs[USE=server])"
-                       disabled+=( ${tests_cvs[@]} )
-               fi
-       fi
-
-       if ! use perl ; then
-               einfo "Disabling tests that need Perl"
-               disabled+=( ${tests_perl[@]} )
+pkg_postinst() {
+       if [[ -z ${REPLACING_VERSIONS} ]] ; then
+               elog "Please read /usr/share/bash-completion/completions/git 
for Git bash command"
+               elog "completion."
+               elog "Please read /usr/share/git/git-prompt.sh for Git bash 
prompt"
+               elog "Note that the prompt bash code is now in that separate 
script"
        fi
 
-       einfo "Disabling tests that fail with SVN 1.7"
-       disabled+=( ${test_svn[@]} )
+       optfeature_header "Some scripts require additional dependencies:"
+       optfeature git-quiltimport dev-util/quilt
+       optfeature git-instaweb www-servers/lighttpd www-servers/apache 
www-servers/nginx
 
-       # Reset all previously disabled tests
-       pushd t &>/dev/null || die
-       local i
-       for i in *.sh.DISABLED ; do
-               [[ -f "${i}" ]] && mv -f "${i}" "${i%.DISABLED}"
-       done
-       einfo "Disabled tests:"
-       for i in ${disabled[@]} ; do
-               if [[ -f "${i}" ]] ; then
-                       mv -f "${i}" "${i}.DISABLED" && einfo "Disabled ${i}"
-               fi
-       done
-
-       # Avoid the test system removing the results because we want them 
ourselves
-       sed -e '/^[[:space:]]*$(MAKE) clean/s,^,#,g' -i Makefile || die
-
-       # Clean old results first, must always run
-       nonfatal git_emake clean
-       popd &>/dev/null || die
-
-       # Now run the tests, keep going if we hit an error, and don't terminate 
on
-       # failure
-       local rc
-       einfo "Start test run"
-       #MAKEOPTS=-j1
-       nonfatal git_emake --keep-going test
-       rc=$?
-
-       # Display nice results, now print the results
-       pushd t &>/dev/null || die
-       nonfatal git_emake aggregate-results
-
-       # And bail if there was a problem
-       [[ ${rc} -eq 0 ]] || die "tests failed. Please file a bug."
-}
-
-showpkgdeps() {
-       local pkg=$1
-       shift
-       elog "  $(printf "%-17s:" ${pkg}) ${@}"
-}
-
-pkg_postinst() {
-       elog "Please read /usr/share/bash-completion/completions/git for Git 
bash command"
-       elog "completion."
-       elog "Please read /usr/share/git/git-prompt.sh for Git bash prompt"
-       elog "Note that the prompt bash code is now in that separate script"
-       elog "These additional scripts need some dependencies:"
-       echo
-       showpkgdeps git-quiltimport "dev-util/quilt"
-       showpkgdeps git-instaweb \
-               "|| ( www-servers/lighttpd www-servers/apache www-servers/nginx 
)"
-       echo
        use mediawiki-experimental && ewarn "Using experimental git-mediawiki 
patches. The stability of cloned wiki filesystems is not guaranteed."
 }

Reply via email to