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

EAPI=8
inherit go-module

DESCRIPTION="Encrypted overlay filesystem written in Go"
HOMEPAGE="https://github.com/rfjakob/gocryptfs"
SRC_URI="https://github.com/rfjakob/gocryptfs/releases/download/v${PV}/${PN}_v${PV}_src-deps.tar.gz"
S=${WORKDIR}/${PN}_v${PV}_src-deps

LICENSE="MIT"
# Vendored licenses
LICENSE+=" Apache-2.0 BSD BSD-2 MIT"
SLOT="0"
KEYWORDS="~amd64"

PROPERTIES="test_privileged"
RESTRICT="test"

RDEPEND="dev-libs/openssl:="
DEPEND="${RDEPEND}"
BDEPEND="virtual/pandoc"

src_prepare() {
	default
	sed -e 's:ldd gocryptfs 2> /dev/null:! ldd gocryptfs | grep -q "statically linked":' \
		-i "${S}/build-without-openssl.bash" || die

	# Code linting not relevant downstream
	sed -e 's/command -v shellcheck/false/' -e 's/\! go tool \| grep vet/false/' \
		-i "${S}/test.bash" || die

	local -A skip_tests=(
		# cli_test.go:450: wrong exit code: want=12, have=20
		["TestMountPasswordIncorrect"]="tests/cli/cli_test.go"
		# cli_test.go:467: want=9, got=20
		["TestMountPasswordEmpty"]="tests/cli/cli_test.go"
		["TestMountPasswordIncorrect"]="tests/cli/cli_test.go"
		# ctlsock: listen unix /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp/gocryptfs-test-parent-0/3259013716/TestOrphanedSocket.572617384.sock: bind: invalid argument
		# cli_test.go:1067: mount failed: exit status 20
		["TestEncryptPaths"]="gocryptfs-xray/xray_tests/xray_test.go"
		["TestOrphanedSocket"]="tests/cli/cli_test.go"
		["TestCtlSock"]="tests/defaults/ctlsock_test.go"
		["TestCtlSockDecrypt"]="tests/defaults/ctlsock_test.go"
		["TestCtlSockDecryptCrash"]="tests/defaults/ctlsock_test.go"
		["TestCtlSockPathOps"]="tests/reverse/ctlsock_test.go"
		["TestCtlSockCrash"]="tests/reverse/ctlsock_test.go"
		["TestSymlinkDentrySize"]="tests/reverse/correctness_test.go"
		["TestExcludeTestFs"]="tests/reverse/exclude_test.go"
		["TestExcludeAllOnlyDir1"]="tests/reverse/exclude_test.go"
		# correctness_test.go:142: should NOT be executable
		["TestAccessVirtualDirIV"]="tests/reverse/correctness_test.go"
		# issue893_test.go:54: mkdir /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp: permission denied
		["TestConcurrentUserOps"]="tests/root_test/issue893_test.go"
		# root_test.go:86: mkdir /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp/gocryptfs-test-parent-0/932700816/default-plain/dir1/dir2: permission denied
		# root_test.go:97: open /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp/gocryptfs-test-parent-0/932700816/default-plain/dir1/file1: permission denied
		["TestSupplementaryGroups"]="tests/root_test/root_test.go"
		# root_test.go:158: mount: /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp/gocryptfs-test-parent-0/932700816/TestDiskFull.ext4.mnt: failed to setup loop device for /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp/gocryptfs-test-parent-0/932700816/TestDiskFull.ext4.
		["TestDiskFull"]="tests/root_test/root_test.go"
		# root_test.go:281: O_RDONLY should have worked, but got error: permission denied
		["TestAcl"]="tests/root_test/root_test.go"
		# root_test.go:340: mount: /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp/gocryptfs-test-parent-0/932700816/TestBtrfsQuirks.img.mnt: failed to setup loop device for /var/tmp/portage/app-crypt/gocryptfs-2.5.4/temp/gocryptfs-test-parent-0/932700816/TestBtrfsQuirks.img.
		["TestBtrfsQuirks"]="tests/root_test/root_test.go"
	)

	for test in "${!skip_tests[@]}"; do
		sed -e "/^func ${test}(/ a	t.Skip(\"Skipped by Gentoo\")" -i ${skip_tests[$test]} || die
	done

	# Doesn't account for the vendor directory
	sed -e 's|find .|find . -path ./vendor -prune -o|' -i test.bash || die
}

src_compile() {
	emake build
}

src_test() {
	emake test
}

src_install() {
	emake "DESTDIR=${ED}" install
	dobin contrib/statfs/statfs
	doman Documentation/*.1
	dodoc -r README.md Documentation
	rm -f "${ED}"/usr/share/doc/${PF}/Documentation/{.gitignore,gocryptfs.1,gocryptfs-xray.1,statfs.1,MANPAGE-render.bash} || die
}