# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

PYTHON_COMPAT=( python3_{10..12} )
inherit edo flag-o-matic go-env optfeature multiprocessing
inherit python-single-r1 toolchain-funcs xdg

if [[ ${PV} == 9999 ]]; then
	inherit git-r3
	EGIT_REPO_URI="https://github.com/kovidgoyal/kitty.git"
else
	inherit verify-sig
	SRC_URI="
		https://github.com/kovidgoyal/kitty/releases/download/v${PV}/${P}.tar.xz
		https://dev.gentoo.org/~ionen/distfiles/${P}-vendor.tar.xz
		verify-sig? ( https://github.com/kovidgoyal/kitty/releases/download/v${PV}/${P}.tar.xz.sig )
	"
	VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/kovidgoyal.gpg
	KEYWORDS="~amd64 ~arm64 ~ppc64 ~riscv ~x86"
fi

DESCRIPTION="Fast, feature-rich, GPU-based terminal"
HOMEPAGE="https://sw.kovidgoyal.net/kitty/"

LICENSE="GPL-3 ZLIB"
LICENSE+=" Apache-2.0 BSD BSD-2 MIT MPL-2.0" # go
SLOT="0"
IUSE="+X test wayland"
REQUIRED_USE="
	${PYTHON_REQUIRED_USE}
	|| ( X wayland )
	test? ( X wayland )
"
RESTRICT="!test? ( test )"

# dlopen: fontconfig,libglvnd
RDEPEND="
	${PYTHON_DEPS}
	dev-libs/openssl:=
	dev-libs/xxhash
	media-libs/fontconfig
	media-libs/harfbuzz:=[truetype]
	media-libs/lcms:2
	media-libs/libglvnd[X?]
	media-libs/libpng:=
	sys-apps/dbus
	sys-libs/zlib:=
	x11-libs/libxkbcommon[X?]
	x11-misc/xkeyboard-config
	~x11-terms/kitty-shell-integration-${PV}
	~x11-terms/kitty-terminfo-${PV}
	X? (
		x11-libs/libX11
		x11-libs/libXcursor
	)
	wayland? ( dev-libs/wayland )
	!sci-mathematics/kissat
"
DEPEND="
	${RDEPEND}
	amd64? ( >=dev-libs/simde-0.8.0-r1 )
	arm64? ( dev-libs/simde )
	x86? ( dev-libs/simde )
	X? (
		x11-base/xorg-proto
		x11-libs/libXi
		x11-libs/libXinerama
		x11-libs/libXrandr
	)
	wayland? ( dev-libs/wayland-protocols )
"
# bug #919751 wrt go subslot
BDEPEND="
	${PYTHON_DEPS}
	>=dev-lang/go-1.22:=
	sys-libs/ncurses
	virtual/pkgconfig
	test? ( $(python_gen_cond_dep 'dev-python/pillow[${PYTHON_USEDEP}]') )
	wayland? ( dev-util/wayland-scanner )
"
[[ ${PV} == 9999 ]] || BDEPEND+=" verify-sig? ( sec-keys/openpgp-keys-kovidgoyal )"

QA_FLAGS_IGNORED="usr/bin/kitten" # written in Go

src_unpack() {
	if [[ ${PV} == 9999 ]]; then
		git-r3_src_unpack
		cd "${S}" || die
		edo go mod vendor
	else
		use verify-sig &&
			verify-sig_verify_detached "${DISTDIR}"/${P}.tar.xz{,.sig}
		default
	fi
}

src_prepare() {
	default

	# sed unfortunately feels easier on maintenance than patches here
	local sedargs=(
		-e "/num_workers =/s/=.*/= $(makeopts_jobs)/"
		-e "s/cflags.append.*-O3.*/pass/" -e 's/-O3//'
		-e "s/cflags.append(fortify_source)/pass/" # use toolchain's _f_s
		-e "s/ld_flags.append('-[sw]')/pass/"
	)

	# kitty is often popular on wayland-only setups, try to allow this
	use !X && sedargs+=( -e '/gl_libs =/s/=.*/= []/' ) #857918
	use !X || use !wayland &&
		sedargs+=( -e "s/'x11 wayland'/'$(usex X x11 wayland)'/" )

	# skip docs for live version, missing dependencies
	[[ ${PV} == 9999 ]] && sedargs+=( -e '/exists.*_build/,/docs(ddir)/d' )

	sed -i setup.py "${sedargs[@]}" || die

	local skiptests=(
		# relies on 'who' command which doesn't detect users with pid-sandbox
		kitty_tests/utmp.py
		# may fail/hang depending on environment and shell initialization
		kitty_tests/{shell_integration,ssh}.py
		# relies on /proc/self/fd and gets confused when ran from here
		tools/utils/tpmfile_test.go
	)
	use !test || rm "${skiptests[@]}" || die
}

src_compile() {
	tc-export CC
	local -x PKGCONFIG_EXE=$(tc-getPKG_CONFIG)

	go-env_set_compile_environment
	local -x GOFLAGS="-p=$(makeopts_jobs) -v -x -buildvcs=false"
	use ppc64 && [[ $(tc-endian) == big ]] || GOFLAGS+=" -buildmode=pie"

	# workaround link errors with Go + gcc + -g3 (bug #924436),
	# retry now and then to see if can be dropped
	tc-is-gcc &&
		CGO_CFLAGS=$(
			CFLAGS=${CGO_CFLAGS}
			replace-flags -g3 -g
			replace-flags -ggdb3 -ggdb
			printf %s "${CFLAGS}"
		)

	local conf=(
		--disable-link-time-optimization
		--ignore-compiler-warnings
		--libdir-name=$(get_libdir)
		--shell-integration="enabled no-rc no-sudo"
		--update-check-interval=0
		--verbose
	)

	edo "${EPYTHON}" setup.py linux-package "${conf[@]}"
	use test && edo "${EPYTHON}" setup.py build-launcher "${conf[@]}"

	rm -r linux-package/share/terminfo || die # provided by kitty-terminfo

	if [[ ${PV} == 9999 ]]; then
		mkdir -p linux-package/share/doc/${PF} || die
	else
		mv linux-package/share/doc/{${PN},${PF}} || die
	fi

	# generate default config as reference, command taken from docs/conf.rst
	if ! tc-is-cross-compiler; then
		linux-package/bin/kitty +runpy \
			'from kitty.config import *; print(commented_out_default_config())' \
			> linux-package/share/doc/${PF}/kitty.conf || die
	fi
}

src_test() {
	KITTY_CONFIG_DIRECTORY=${T} ./test.py || die # shebang is kitty
}

src_install() {
	edo mv linux-package "${ED}"/usr
}

pkg_postinst() {
	xdg_pkg_postinst

	optfeature "audio-based terminal bell support" media-libs/libcanberra
	optfeature "opening links from the terminal" x11-misc/xdg-utils
}