# Contributor: Łukasz Jendrysik <scadu@yandex.com>
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
#
# secfixes:
#   2.49.1-r0:
#     - CVE-2025-27613
#     - CVE-2025-27614
#     - CVE-2025-46334
#     - CVE-2025-46835
#     - CVE-2025-48384
#     - CVE-2025-48385
#     - CVE-2025-48386
#   2.48.1-r0:
#     - CVE-2024-50349
#     - CVE-2024-52006
#   2.45.1-r0:
#     - CVE-2024-32002
#     - CVE-2024-32004
#     - CVE-2024-32020
#     - CVE-2024-32021
#     - CVE-2024-32465
#   2.40.1-r0:
#     - CVE-2023-25652
#     - CVE-2023-25815
#     - CVE-2023-29007
#   2.39.2-r0:
#     - CVE-2023-22490
#     - CVE-2023-23946
#   2.39.1-r0:
#     - CVE-2022-41903
#     - CVE-2022-23521
#   2.38.1-r0:
#     - CVE-2022-39253
#     - CVE-2022-39260
#   2.37.1-r0:
#     - CVE-2022-29187
#   2.35.2-r0:
#     - CVE-2022-24765
#   2.30.2-r0:
#     - CVE-2021-21300
#   2.26.2-r0:
#     - CVE-2020-11008
#   2.26.1-r0:
#     - CVE-2020-5260
#   2.24.1-r0:
#     - CVE-2019-1348
#     - CVE-2019-1349
#     - CVE-2019-1350
#     - CVE-2019-1351
#     - CVE-2019-1352
#     - CVE-2019-1353
#     - CVE-2019-1354
#     - CVE-2019-1387
#     - CVE-2019-19604
#   2.19.1-r0:
#     - CVE-2018-17456
#   2.17.1-r0:
#     - CVE-2018-11233
#     - CVE-2018-11235
#   2.14.1-r0:
#     - CVE-2017-1000117
#   0:
#     - CVE-2021-29468
#     - CVE-2021-46101

pkgname=git
pkgver=2.49.1
pkgrel=0
pkgdesc="Distributed version control system"
url="https://www.git-scm.com/"
arch="all"
license="GPL-2.0-only"
makedepends="
	curl-dev
	expat-dev
	file
	openssl-dev>3
	pcre2-dev
	perl-dev
	perl-error
	xmlto
	zlib-dev
	"
# note that order matters
subpackages="
	$pkgname-dbg
	$pkgname-bash-completion
	$pkgname-prompt::noarch
	perl-$pkgname-svn:_perl_git_svn:noarch
	perl-$pkgname:_perl_git:noarch
	$pkgname-svn::noarch
	$pkgname-email
	$pkgname-fast-import:_fast_import:noarch
	$pkgname-cvs::noarch
	$pkgname-daemon
	$pkgname-daemon-openrc:daemon_openrc
	$pkgname-scalar
	$pkgname-gitweb::noarch
	$pkgname-subtree::noarch
	$pkgname-diff-highlight:diff_highlight:noarch
	$pkgname-perl:_git_perl:noarch
	$pkgname-init-template:_init_template:noarch
	"
source="https://www.kernel.org/pub/software/scm/git/git-$pkgver.tar.xz
	git-daemon.initd
	git-daemon.confd
	fix-t4219-with-sticky-bit.patch
	"

_gitcoredir=/usr/libexec/git-core

if [ -z "$BOOTSTRAP" ] && [ -z "$APORTS_BOOTSTRAP" ]; then
	# we need tcl and tk to be built before git due to git-gui and gitk
	makedepends="$makedepends asciidoc python3-dev tcl tk libsecret-dev glib-dev"
	subpackages="$subpackages
		$pkgname-doc
		$pkgname-p4::noarch
		$pkgname-gui::noarch
		$pkgname-gitk::noarch
		$pkgname-subtree-doc:subtree_doc:noarch
		$pkgname-credential-libsecret:credential_libsecret
		"
	_full_build=1
fi

case "$CARCH" in
s390x)
	# todo: they fail with strange between-test email mismatches
	options="$options !check"
	;;
esac

prepare() {
	default_prepare

	cat >> config.mak <<-EOF
		NO_GETTEXT=YesPlease
		NO_SVN_TESTS=YesPlease
		NO_REGEX=YesPlease
		NO_SYS_POLL_H=1
		ICONV_OMITS_BOM=Yes
		INSTALL_SYMLINKS=1
		CC=${CC:-cc}
		CXX=${CC:-c++}
		CFLAGS=$CFLAGS -flto=auto
		LDFLAGS=$LDFLAGS -flto=auto
		USE_LIBPCRE2=YesPlease
		PYTHON_PATH=/usr/bin/python3
	EOF

	if [ -z "$_full_build" ]; then
		cat >> config.mak <<-EOF
			NO_PYTHON=YesPlease
			NO_TCLTK=YesPlease
		EOF
	fi
}

build() {
	make prefix=/usr \
		DESTDIR="$pkgdir" \
		perllibdir="$(_perl_config vendorlib)" \
		all

	make -C contrib/subtree prefix=/usr DESTDIR="$pkgdir"
	make -C contrib/diff-highlight prefix=/usr DESTDIR="$pkgdir"

	if [ -n "$_full_build" ]; then
		# generate manpages outside of package()
		make prefix=/usr man

		make prefix=/usr -C contrib/credential/libsecret
	fi
}

check() {
	make -C t prefix=/usr DESTDIR="$pkgdir" \
		perlibdir="$(_perl_config vendorlib)" \
		all
}

package() {
	if [ -n "$_full_build" ]; then
		local install_man=install-man
	fi

	make prefix=/usr \
		DESTDIR="$pkgdir" \
		INSTALLDIRS=vendor \
		perllibdir="$(_perl_config vendorlib)" \
		install \
		$install_man

	make -C contrib/subtree install prefix=/usr DESTDIR="$pkgdir"

	mkdir -p "$pkgdir"/var/git

	install -Dm755 "$srcdir"/git-daemon.initd "$pkgdir"/etc/init.d/git-daemon
	install -Dm644 "$srcdir"/git-daemon.confd "$pkgdir"/etc/conf.d/git-daemon

	install -Dm755 contrib/diff-highlight/diff-highlight -t "$pkgdir"/usr/bin/

	install -Dm644 contrib/completion/git-completion.bash \
		"$pkgdir"/usr/share/bash-completion/completions/git

	install -Dm644 contrib/completion/git-prompt.sh \
		"$pkgdir"/usr/share/git-core/git-prompt.sh

	if [ -n "$_full_build" ]; then
		install -Dm755 contrib/credential/libsecret/git-credential-libsecret "$pkgdir"/usr/libexec/git-core
	fi
}

prompt() {
	pkgdesc="bash and zsh prompt integration for Git"
	depends="git=$pkgver-r$pkgrel"

	amove usr/share/git-core/git-prompt.sh
}

_perl_git_svn() {
	pkgdesc="Perl interface to Git::SVN"
	depends="git=$pkgver-r$pkgrel perl-git=$pkgver-r$pkgrel"

	local vendorlib=$(_perl_config vendorlib)

	amove $vendorlib/Git/SVN*
}

_perl_git() {
	pkgdesc="Perl interface to Git"
	depends="git=$pkgver-r$pkgrel perl-error"

	local i
	for i in "$(_perl_config vendorlib)" "$(_perl_config vendorarch)"; do
		[ -d "$pkgdir/$i" ] || continue
		amove $i
	done
}

email() {
	pkgdesc="Git tools for sending email"
	depends="perl perl-git=$pkgver-r$pkgrel perl-net-smtp-ssl perl-authen-sasl"

	amove $_gitcoredir/*email*
	amove $_gitcoredir/*imap*
}

svn() {
	pkgdesc="Subversion support for git"
	depends="
		perl
		perl-git-svn=$pkgver-r$pkgrel
		perl-subversion
		perl-term-readkey
		"

	amove $_gitcoredir/git-svn
}

cvs() {
	pkgdesc="Git tools for importing CVS repositories"
	depends="perl perl-git=$pkgver-r$pkgrel cvs perl-dbd-sqlite"

	amove usr/bin/git-cvs*
	amove $_gitcoredir/*cvs*
}

_fast_import() {
	pkgdesc="Git backend for fast Git data importers"
	depends="git=$pkgver-r$pkgrel"

	amove $_gitcoredir/git-fast-import
}

p4() {
	pkgdesc="Git tools for working with Perforce depots"
	depends="git=$pkgver-r$pkgrel git-fast-import=$pkgver-r$pkgrel"

	amove $_gitcoredir/*p4*
	amove $_gitcoredir/mergetools/*p4*
}

daemon() {
	pkgdesc="Git protocol daemon"
	depends="git=$pkgver-r$pkgrel"

	amove $_gitcoredir/git-daemon
	amove $_gitcoredir/git-http-backend
	amove $_gitcoredir/git-shell
	amove var/git
}

daemon_openrc() {
	pkgdesc="Git protocol daemon"

	default_openrc

	depends="git-daemon=$pkgver-r$pkgrel $depends_openrc"
	install_if="openrc $pkgname-daemon=$pkgver-r$pkgrel"
}

gitweb() {
	pkgdesc="Simple web interface to git repositories"
	depends="git=$pkgver-r$pkgrel perl"

	amove $_gitcoredir/git-instaweb
	amove usr/share/gitweb
}

subtree() {
	depends="git=$pkgver-r$pkgrel"
	pkgdesc="Split git repository into subtrees"

	amove $_gitcoredir/git-subtree
}

subtree_doc() {
	pkgdesc="Split git repository into subtrees (documentation)"
	depends=""
	install_if="docs git-subtree=$pkgver-r$pkgrel"

	cd "$builddir"/contrib/subtree
	make install-man prefix=/usr DESTDIR="$subpkgdir"
	gzip -9 "$subpkgdir"/usr/share/man/man1/git-subtree.1
}

gui() {
	pkgdesc="GUI interface for git"
	depends="git=$pkgver-r$pkgrel tcl tk"

	amove usr/share/git-gui
	amove $_gitcoredir/git-citool
	amove $_gitcoredir/git-gui
	amove $_gitcoredir/git-gui--askpass
}

gitk() {
	pkgdesc="Gitk interface for git"
	depends="git=$pkgver-r$pkgrel tcl tk"

	amove usr/share/gitk
	amove usr/bin/gitk
}

diff_highlight() {
	pkgdesc="diff highlight for git"
	depends="git=$pkgver-r$pkgrel perl"

	amove usr/bin/diff-highlight
}

credential_libsecret() {
	pkgdesc="libsecret-based credential helper"
	depends="git=$pkgver-r$pkgrel"

	amove usr/libexec/git-core/git-credential-libsecret
}

scalar() {
	pkgdesc="Git scalar monorepo tool"
	depends="git=$pkgver-r$pkgrel"

	amove usr/bin/scalar
	amove usr/libexec/git-core/scalar
}

# catch-the-rest of stuff that needs perl
_git_perl() {
	pkgdesc="Additional Git commands that requires perl"
	depends="git=$pkgver-r$pkgrel perl-git=$pkgver-r$pkgrel perl"
	install_if="git=$pkgver-r$pkgrel perl"

	mkdir -p "$subpkgdir"/usr/lib
	cd "$pkgdir"
	find . -type f -print0 | xargs -0 file --mime-type | grep perl | cut -d: -f1 | while read -r f; do
		amove "$f"
	done
	find "$subpkgdir" -name perllocal.pod -delete
}

# Prints values of the Config.pm variable $1.
_perl_config() {
	perl -e "use Config; print \$Config{$1};"
}

_init_template() {
	pkgdesc="Git init template directory"
	# Some scripts expect file from the template to exist. Installing
	# them by default for compatibility
	install_if="git=$pkgver-r$pkgrel"

	# leave empty directory to prevent git warning
	mkdir -p -- "$subpkgdir"/usr/share/git-core/templates
	mv -- "$pkgdir"/usr/share/git-core/templates/* "$subpkgdir"/usr/share/git-core/templates
}

sha512sums="
4dc63f2935e66d708dbecfdb77c6e5d697f4bc79af51ab860ed87499336d66d44f16abc7edf414c56f30d46de3a1a676c56c240557140c91aa388136e652cbdc  git-2.49.1.tar.xz
89528cdd14c51fd568aa61cf6c5eae08ea0844e59f9af9292da5fc6c268261f4166017d002d494400945e248df6b844e2f9f9cd2d9345d516983f5a110e4c42a  git-daemon.initd
fbf1f425206a76e2a8f82342537ed939ff7e623d644c086ca2ced5f69b36734695f9f80ebda1728f75a94d6cd2fcb71bf845b64239368caab418e4d368c141ec  git-daemon.confd
be5d568fc5b8b84c9afb97b31e471e41f32ccfe188eba0588ea0ef98b2d96c2ce4b2c1a3d70e88205aa4f6667f850b3f32c13bbb149ecddbf670344c162a4e25  fix-t4219-with-sticky-bit.patch
"
