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

# NOTICE: Before packaging we have to run "ResGen" and "GetDependencies".
# See: https://git.alpinelinux.org/aports/tree/community/powershell/APKBUILD
# The repackaged tarball contains some C# code generated by that subproject.

EAPI=8

DOTNET_PKG_COMPAT="10.0"
NUGET_APIS=(
	"https://api.nuget.org/v3-flatcontainer"
	"https://www.powershellgallery.com/api/v2"
)
NUGETS="
dotnetanalyzers.documentationanalyzers.unstable@1.0.0.59
dotnetanalyzers.documentationanalyzers@1.0.0-beta.59
humanizer.core@2.14.1
json.more.net@2.1.1
jsonpointer.net@5.3.1
jsonschema.net@7.4.0
markdig.signed@0.31.0
markdig.signed@0.44.0
microsoft.applicationinsights@2.23.0
microsoft.bcl.asyncinterfaces@10.0.5
microsoft.codeanalysis.analyzers@3.11.0
microsoft.codeanalysis.analyzers@5.3.0
microsoft.codeanalysis.common@5.0.0
microsoft.codeanalysis.csharp@5.0.0
microsoft.codecoverage@18.0.1
microsoft.extensions.objectpool@10.0.0
microsoft.extensions.objectpool@10.0.5
microsoft.management.infrastructure.runtime.unix@3.0.0
microsoft.management.infrastructure.runtime.win@3.0.0
microsoft.management.infrastructure@3.0.0
microsoft.net.test.sdk@18.0.1
microsoft.netcore.platforms@1.1.2
microsoft.powershell.markdownrender@7.2.1
microsoft.powershell.native@700.0.0-rc.1
microsoft.security.extensions@1.4.0
microsoft.testplatform.objectmodel@18.0.1
microsoft.testplatform.testhost@18.0.1
microsoft.win32.registry.accesscontrol@10.0.5
microsoft.win32.systemevents@10.0.5
microsoft.windows.compatibility@10.0.5
netstandard.library@2.0.3
newtonsoft.json@13.0.3
newtonsoft.json@13.0.4
packagemanagement@1.4.8.1
runtime.android-arm.runtime.native.system.io.ports@10.0.5
runtime.android-arm64.runtime.native.system.io.ports@10.0.5
runtime.android-x64.runtime.native.system.io.ports@10.0.5
runtime.android-x86.runtime.native.system.io.ports@10.0.5
runtime.linux-arm.runtime.native.system.io.ports@10.0.5
runtime.linux-arm64.runtime.native.system.io.ports@10.0.5
runtime.linux-bionic-arm64.runtime.native.system.io.ports@10.0.5
runtime.linux-bionic-x64.runtime.native.system.io.ports@10.0.5
runtime.linux-musl-arm.runtime.native.system.io.ports@10.0.5
runtime.linux-musl-arm64.runtime.native.system.io.ports@10.0.5
runtime.linux-musl-x64.runtime.native.system.io.ports@10.0.5
runtime.linux-x64.runtime.native.system.io.ports@10.0.5
runtime.maccatalyst-arm64.runtime.native.system.io.ports@10.0.5
runtime.maccatalyst-x64.runtime.native.system.io.ports@10.0.5
runtime.native.system.data.sqlclient.sni@4.4.0
runtime.native.system.io.ports@10.0.5
runtime.osx-arm64.runtime.native.system.io.ports@10.0.5
runtime.osx-x64.runtime.native.system.io.ports@10.0.5
runtime.win-arm64.runtime.native.system.data.sqlclient.sni@4.4.0
runtime.win-x64.runtime.native.system.data.sqlclient.sni@4.4.0
runtime.win-x86.runtime.native.system.data.sqlclient.sni@4.4.0
stylecop.analyzers.unstable@1.2.0.556
stylecop.analyzers@1.2.0-beta.556
system.buffers@4.6.1
system.codedom@10.0.5
system.collections.immutable@9.0.14
system.componentmodel.composition.registration@10.0.5
system.componentmodel.composition@10.0.5
system.configuration.configurationmanager@10.0.5
system.data.odbc@10.0.5
system.data.oledb@10.0.5
system.data.sqlclient@4.9.0
system.data.sqlclient@4.9.1
system.diagnostics.eventlog@10.0.5
system.diagnostics.performancecounter@10.0.5
system.directoryservices.accountmanagement@10.0.5
system.directoryservices.protocols@10.0.5
system.directoryservices@10.0.5
system.drawing.common@10.0.5
system.io.packaging@10.0.5
system.io.ports@10.0.5
system.management@10.0.5
system.memory@4.6.3
system.net.http.winhttphandler@10.0.5
system.numerics.vectors@4.6.1
system.reflection.context@10.0.5
system.reflection.metadata@9.0.14
system.runtime.caching@10.0.5
system.runtime.compilerservices.unsafe@6.1.2
system.security.cryptography.pkcs@10.0.5
system.security.cryptography.protecteddata@10.0.5
system.security.cryptography.xml@10.0.0
system.security.cryptography.xml@10.0.5
system.security.permissions@10.0.5
system.servicemodel.http@10.0.652802
system.servicemodel.http@8.1.2
system.servicemodel.netframingbase@10.0.652802
system.servicemodel.nettcp@10.0.652802
system.servicemodel.nettcp@8.1.2
system.servicemodel.primitives@10.0.652802
system.servicemodel.primitives@8.1.2
system.servicemodel.syndication@10.0.5
system.serviceprocess.servicecontroller@10.0.5
system.speech@10.0.5
system.text.encoding.codepages@8.0.0
system.threading.tasks.extensions@4.6.3
system.web.services.description@8.1.2
system.windows.extensions@10.0.5
validation@2.6.68
xunit.abstractions@2.0.3
xunit.analyzers@1.18.0
xunit.assert@2.9.3
xunit.core@2.9.3
xunit.extensibility.core@2.4.0
xunit.extensibility.core@2.9.3
xunit.extensibility.execution@2.4.0
xunit.extensibility.execution@2.9.3
xunit.runner.visualstudio@3.1.5
xunit.skippablefact@1.5.61
xunit@2.9.3
xunitxml.testlogger@8.0.0
"

# Additional PowerShell Gallery modules.
NUGETS+="
microsoft.powershell.archive@1.2.5
microsoft.powershell.psresourceget@1.2.0
microsoft.powershell.threadjob@2.2.0
packagemanagement@1.4.8.1
powershellget@2.2.5
psreadline@2.4.5
"

inherit check-reqs desktop dotnet-pkg xdg-utils

DESCRIPTION="Cross-platform automation and configuration tool"
HOMEPAGE="https://microsoft.com/powershell/
	https://github.com/PowerShell/PowerShell/"
SRC_URI="
	https://dev.gentoo.org/~xgqt/distfiles/repackaged/${P}.repackaged.tar.xz
	${NUGET_URIS}
"

LICENSE="MIT"
SLOT="$(ver_cut 1-2)"
KEYWORDS="~amd64 ~arm ~arm64"
IUSE="gui vanilla"

RDEPEND="
	>=dev-libs/libpsl-native-7.4.0:=
	dev-libs/openssl-compat:1.0.0
	sys-libs/pam:0/0
	gui? (
		dev-util/desktop-file-utils
		x11-misc/shared-mime-info
	)
"
DEPEND="
	${RDEPEND}
"
IDEPEND="
	app-eselect/eselect-pwsh
"

CHECKREQS_DISK_BUILD="2G"
DOTNET_PKG_PROJECTS=(
	src/powershell-unix/powershell-unix.csproj
	src/Modules/PSGalleryModules.csproj
)
DOTNET_PKG_RESTORE_EXTRA_ARGS=(
	-p:"RollForward=Major"
	-p:"RuntimeIdentifiers="
	-p:"TreatWarningsAsErrors=false"
)
DOTNET_PKG_BUILD_EXTRA_ARGS=(
	"${DOTNET_PKG_RESTORE_EXTRA_ARGS[@]}"
)
PATCHES=(
	"${FILESDIR}/pwsh-7.3.3-disable-update-check.patch"
)
DOCS=( CHANGELOG CHANGELOG.md CODE_OF_CONDUCT.md README.md docs )

check_requirements_locale() {
	if [[ "${MERGE_TYPE}" != binary ]] ; then
		if use elibc_glibc ; then
			local locales="$(locale -a)"

			if has en_US.utf8 ${locales} ; then
				LC_ALL="en_US.utf8"
			elif has en_US.UTF-8 ${locales} ; then
				LC_ALL="en_US.UTF-8"
			else
				eerror "The locale en_US.utf8 or en_US.UTF-8 is not available."
				eerror "Please generate en_US.UTF-8 before building ${CATEGORY}/${P}."

				die "Could not switch to the en_US.UTF-8 locale."
			fi
		else
			LC_ALL="en_US.UTF-8"
		fi

		export LC_ALL
		einfo "Successfully switched to the ${LC_ALL} locale."
	fi
}

pkg_pretend() {
	check-reqs_pkg_pretend

	check_requirements_locale
}

pkg_setup() {
	check-reqs_pkg_setup
	dotnet-pkg_pkg_setup

	check_requirements_locale
}

src_prepare() {
	if ! use vanilla ; then
		PATCHES+=(
			"${FILESDIR}/pwsh-7.5.0-disable-telemetry.patch"
		)
	fi

	# This is guarded by "RegexGitVersion" in "PowerShell.Common.props".
	local fake_describe="v${PV}-0-g0"
	sed -e "s|git describe --abbrev=60 --long|echo ${fake_describe}|g" \
		-i ./PowerShell.Common.props || die

	echo "v${PV}" > ./powershell.version || die

	dotnet-pkg_src_prepare
}

src_compile() {
	einfo 'Copying DLL files for the missing "ref" directory'
	efsi "${FILESDIR}/pwsh-7.3.3-copy-ref.fsx" "${WORKDIR}/${P}_ref"

	dotnet-pkg_src_compile
}

src_test() {
	local -a test_args=(
		"${DOTNET_PKG_RESTORE_EXTRA_ARGS[@]}"
		-p:"RuntimeIdentifier=${DOTNET_PKG_RUNTIME}"
		"${S}/test/xUnit/xUnit.tests.csproj"
	)
	dotnet-pkg-base_restore "${test_args[@]}"
	dotnet-pkg-base_test "${test_args[@]}"
}

src_install() {
	local dest_root="/usr/share/${PN}-${SLOT}"

	# Install additional PowerShell Gallery modules.
	local -a psg_modules=(
		Microsoft.PowerShell.Archive
		Microsoft.PowerShell.PSResourceGet
		Microsoft.PowerShell.ThreadJob
		PSReadLine
		PackageManagement
		PowerShellGet
	)
	local psg_module=""
	for psg_module in "${psg_modules[@]}" ; do
		insinto "${dest_root}/Modules/${psg_module}"
		doins -r "${NUGET_PACKAGES}/${psg_module,,}"/*
	done

	dotnet-pkg-base_append_launchervar 'DOTNET_ROLL_FORWARD="Major"'
	dotnet-pkg-base_append_launchervar 'PSModulePath="${PSModulePath}:${EPREFIX}/usr/share/GentooPowerShell/Modules:"'
	dotnet-pkg-base_install "${dest_root}"
	dotnet-pkg-base_dolauncher-portable "${dest_root}/pwsh.dll" "pwsh-${SLOT}"

	insinto "${dest_root}/ref"
	doins "${WORKDIR}/${P}_ref"/*

	# Fix runtime config because we roll forward from .NET 9.0 into .NET >-10.0.
	sed -i "${ED}/${dest_root}/pwsh.runtimeconfig.json" \
		-e "s|.*rollForwardOnNoCandidateFx.*||g" \
		|| die "sed failed"

	# Replace "libpsl-native.so" provided by "microsoft.powershell.native".
	rm "${ED}/${dest_root}/libpsl-native.so" || die
	dosym -r "/usr/$(get_libdir)/libpsl-native.so" "${dest_root}/libpsl-native.so"

	# On musl remove "libSystem.IO.Ports.Native.so" linked against glibc.
	if ! use elibc_glibc ; then
		ewarn "libSystem.IO.Ports.Native.so is available only for glibc, removing it"

		rm -f "${ED}/${dest_root}/libSystem.IO.Ports.Native.so" || die
	fi

	if use gui ; then
		newicon ./assets/ps_black_128.svg "powershell-${SLOT}.svg"
		make_desktop_entry "pwsh-${SLOT} -l" "PowerShell ${SLOT}" \
			"powershell-${SLOT}" "ConsoleOnly;System;" "Terminal=true"
	fi

	einstalldocs
}

pkg_postinst() {
	if use gui ; then
		xdg_icon_cache_update
		xdg_desktop_database_update
	fi

	eselect pwsh update ifunset
}

pkg_postrm() {
	if use gui ; then
		xdg_icon_cache_update
		xdg_desktop_database_update
	fi

	eselect pwsh update ifunset
}