# Maintainer (aur): lantw44 (at) gmail (dot) com
# Modified from guix-git 20130119 PKGBUILD
# Maintainer: Parabola Hackers <dev@lists.parabola.nu>

# parabola changes and rationale:
# - Kept sysvinit service files as Parabola also supports OpenRC
# - Disable tests as they fail:
#  |  make  check-TESTS check-local
#  [...]
#  |  FAIL: tests/build-utils.scm
#  [...]
#  |  FAIL: tests/challenge.scm
#  [...]
#  |  FAIL: tests/containers.scm

# In order to verify the PGP signature of the source archive, you may need to
# use this command to download the needed public key:
#   gpg --recv-keys 3CE464558A84FDC69DB40CFB090B11993D9AEBB5

pkgname=guix
pkgver=1.5.0
pkgrel=21
pkgdesc='A purely functional package manager for the GNU system'
arch=('x86_64' 'i686' 'armv7h')
url='https://guix.gnu.org'
license=('GPL3')
options=('!strip')
makedepends=(
  'autoconf'
  'automake'
  'guile-ssh>=0.13.0'
  'guile-zstd'
  'guile-semver'
  'guile-lib'
  'bash-completion'
  'fish'
  'help2man'
  'po4a')
depends=(
  'git'
  'guix-guile>=3.0.3'
  'guile-gcrypt>=0.1.0'
  'guile-gnutls'
  'guile-sqlite3>=0.1.0'
  'guile-zlib>=0.1.0'
  'guile-lzlib'
  'guile-avahi'
  'guile-git>=0.10.0'
  'guile-json>=4.3.0'
  'guile-lzma'
  'sqlite>=3.6.19'
  'bzip2'
  'guix-disarchive'
  'gnutls'
  'libgcrypt')
optdepends=(
  'bash-completion: to enable bash programmable completion'
  'guile-ssh: to offload builds to other machines'
  'guile-zstd: to use and publish zstd substitutes'
  'guile-semver: to use the crate importer'
  'guile-lib: to use the go importer')
source=(
  "https://ftp.gnu.org/gnu/${pkgname}/${pkgname}-${pkgver}.tar.gz"{,.sig}
  'guix-hook'
  'guix-1-5-0-create-directories.hook'
  'guix-1-5-0-show-notice.hook'
  'guix-enable-substitutes-by-default.hook'
  'guix-remove-build-users.hook'
  'guix-fix-etc-guix-acl-permissions.hook')

sha256sums=(
    # ${pkgname}-${pkgver}.tar.gz
    'df2102eed00aff0b17275654a42f094c8a1117ec065884eb1ff76005e47415c5'
    # ${pkgname}-${pkgver}.tar.gz.sig
    'SKIP'
    # guix-hook
    'SKIP'
    # guix-1-5-0-create-directories.hook
    'SKIP'
    # guix-1-5-0-show-notice.hook
    'SKIP'
    # guix-enable-substitutes-by-default.hook
    'SKIP'
    # guix-remove-build-users.hook
    'SKIP'
    # guix-fix-etc-guix-acl-permissions.hook
    'SKIP')

# Efraim Flashner <efraim@flashner.co.il>"
validpgpkeys=('A28BF40C3E551372662D14F741AAE7DCCA3D8351')

prepare() {
	cd "${srcdir}/${pkgname}-${pkgver}"
	local source_file
	for source_file in "${source[@]}"; do
		case "${source_file}" in
			*.patch)
				patch -p1 < "${srcdir}/${source_file}"
				;;
		esac
	done
}

build() {
	local bash_completion_dir="$(pkg-config --variable=completionsdir bash-completion)"
	local fish_completion_dir="$(pkg-config --variable=completionsdir fish)"
	cd "${srcdir}/${pkgname}-${pkgver}"
	./bootstrap
	./configure --prefix=/usr --sbindir=/usr/bin --sysconfdir=/etc \
		--libexecdir=/usr/lib --localstatedir=/var \
		--with-bash-completion-dir="${bash_completion_dir}" \
		--with-fish-completion-dir="${fish_completion_dir}" \
		--disable-rpath \
		ac_cv_guix_test_root="$(pwd)/t"
	make
}

check() {
	cd "${srcdir}/${pkgname}-${pkgver}"
	# # Check whether the current working directory is too long
	# local cwd_str="$(pwd)"
	# local cwd_len="${#cwd_str}"
	# # The test tests/gexp.scm fails when the path is longer than 29 bytes
	# # because of the length limit on the shebang line. Since we have increased
	# # the limit by 7 by renaming test-tmp to t with ac_cv_guix_test_root cache
	# # variable, the limit we use here is 36 bytes.
	# if [ "${cwd_len}" -gt 36 ]; then
	# 	error "${cwd_str} is too long."
	# 	error "The working directory cannot be longer than 36 bytes."
	# 	false
	# fi
	# # Make sure we have a valid shell accepting -c option. We cannot run tests
	# # in parallel because it can cause permission denied error when copying
	# # gnu/packages/bootstrap/i686-linux/bash.
	# SHELL=/bin/sh make check -j1
}

package() {
	cd "${srcdir}/${pkgname}-${pkgver}"
	make DESTDIR="${pkgdir}" install
	# Rename systemd service files provided by upstream because they are not
	# usable without previous guix installation
	local system_unit_dir="${pkgdir}/usr/lib/systemd/system"
	local guix_daemon_default="${system_unit_dir}/guix-daemon.service"
	local guix_daemon_upstream="${system_unit_dir}/guix-daemon-latest.service"
	local guix_gc_default="${system_unit_dir}/guix-gc.service"
	local guix_gc_upstream="${system_unit_dir}/guix-gc-latest.service"
	local guix_publish_default="${system_unit_dir}/guix-publish.service"
	local guix_publish_upstream="${system_unit_dir}/guix-publish-latest.service"
	mv "${guix_daemon_default}" "${guix_daemon_upstream}"
	mv "${guix_gc_default}" "${guix_gc_upstream}"
	mv "${guix_publish_default}" "${guix_publish_upstream}"
	# Generate default systemd service files from upstream ones by fixing paths
	local guix_profile_root="/var/guix/profiles/per-user/root/current-guix"
	sed -e "s|^ExecStart=${guix_profile_root}/bin|ExecStart=/usr/bin|" \
		-e "s|^Description=\(.*\)|Description=\1 (default)|" \
		-e "/^Environment=/d" "${guix_daemon_upstream}" \
		> "${guix_daemon_default}"
	sed -e "s|^ExecStart=${guix_profile_root}/bin|ExecStart=/usr/bin|" \
		-e "s|^Description=\(.*\)|Description=\1 (default)|" \
		-e "/^Environment=/d" "${guix_gc_upstream}" \
		> "${guix_gc_default}"
	sed -e "s|^ExecStart=${guix_profile_root}/bin|ExecStart=/usr/bin|" \
		-e "s|^Description=\(.*\)|Description=\1 (default)|" \
		-e "/^Environment=/d" "${guix_publish_upstream}" \
		> "${guix_publish_default}"
	# Make sure the above sed commands really work
	! cmp "${guix_daemon_default}" "${guix_daemon_upstream}"
	! cmp "${guix_gc_default}" "${guix_gc_upstream}"
	! cmp "${guix_publish_default}" "${guix_publish_upstream}"
	# Edit the description of upstream systemd service files
	sed -i "s|^Description=\(.*\)|Description=\1 (upstream)|" \
		"${guix_daemon_upstream}" \
		"${guix_gc_upstream}" \
		"${guix_publish_upstream}"
	# The default makepkg strip option cannot be used here because binaries
	# installed in /usr/share must not be stripped.
	# To keep user-defined 'strip' and 'debug' options useful, we still
	# depend on 'tidy_strip' function provided by makepkg to do the stripping
	# work. To make the function useful, we have to temporarily remove the
	# '!strip' option from 'options' array. However, assignments to 'options'
	# cause mksrcinfo to insert wrong lines to .SRCINFO, so they have to be
	# put in eval.
	eval 'options=()'
	cd "${pkgdir}/usr/bin"
	# tidy_strip may exit with a non-zero return value even if all operations
	# are successful. Therefore, we have to ignore its return value to prevent
	# makepkg from reporting it as an error.
	tidy_strip || true
	eval 'options=("!strip")'

	# Hooks to do the proper setup (build users, etc) for the guix-daemon
	install -D -m0755 "${srcdir}"/guix-hook \
		-t "$pkgdir"/usr/share/libalpm/scripts
	install -D -m0644 "${srcdir}"/guix-1-5-0-create-directories.hook \
		-t "$pkgdir"/usr/share/libalpm/hooks
	install -D -m0644 "${srcdir}"/guix-1-5-0-show-notice.hook \
		-t "$pkgdir"/usr/share/libalpm/hooks
	install -D -m0644 "${srcdir}"/guix-enable-substitutes-by-default.hook \
		-t "$pkgdir"/usr/share/libalpm/hooks
	install -D -m0644 "${srcdir}"/guix-remove-build-users.hook \
		-t "$pkgdir"/usr/share/libalpm/hooks
	install -D -m0644 "${srcdir}"/guix-fix-etc-guix-acl-permissions.hook \
		-t "$pkgdir"/usr/share/libalpm/hooks
}
