#!/bin/bash

. "$(dirname $0)/config"
. "$(dirname $0)/db-functions"

if [ $# -ge 1 ]; then
	warning "Calling ${0##*/} with a specific repository is no longer supported"
	exit 1
fi

# Find repos with packages to release
staging_repos=($(find  "${STAGING}" -mindepth 1 -type f -name "*${PKGEXT}" -printf '%h\n' | sort -u))
if [ $? -ge 1 ]; then
	die "Could not read ${STAGING}"
fi

repos=()
for staging_repo in ${staging_repos[@]##*/}; do
	if in_array ${staging_repo} ${PKGREPOS[@]}; then
		repos+=(${staging_repo})
	fi
done

# TODO: this might lock too much (architectures)
for repo in ${repos[@]}; do
	for pkgarch in ${ARCHES[@]}; do
		repo_lock ${repo} ${pkgarch} || exit 1
	done
done

#for staging_user in $(ls ${STAGING}); do
	# check if packages are valid
	for repo in ${repos[@]}; do
		if ! check_repo_permission "${repo}"; then
			die "You don't have permission to update packages in ${repo}"
		fi
		pkgs=($(getpkgfiles "${STAGING}/*/staging/${repo}/"*${PKGEXT}))
		if [ $? -eq 0 ]; then
			for pkg in ${pkgs[@]}; do
				if [ -h "${pkg}" ]; then
					die "Package ${repo}/${pkg##*/} is a symbolic link"
				fi
				if ! check_pkgfile "${pkg}"; then
					die "Package ${repo}/${pkg##*/} is not consistent with its meta data"
				fi
				if ! pacman-key -v "${pkg}.sig" >/dev/null 2>&1; then
					die "Package ${repo}/${pkg##*/} does not have a valid signature"
				fi
				if ! check_pkgrepos "${pkg}"; then
					die "Package ${repo}/${pkg##*/} already exists in another repository"
				fi
				if ! check_packager "${pkg}"; then
					die "Package ${repo}/${pkg##*/} does not have a valid packager"
				fi
				if ! check_buildinfo "${pkg}"; then
					die "Package ${repo}/${pkg##*/} does not have a .BUILDINFO file"
				fi
				if ! check_builddir "${pkg}"; then
					die "Package ${repo}/${pkg##*/} was not built in a chroot"
				fi
			done
			if ! check_splitpkgs ${repo} ${pkgs[@]}; then
				die "Missing split packages for ${repo}"
			fi
		else
			die "Could not read ${STAGING}"
		fi
	done

	for repo in ${repos[@]}; do
		msg "Updating [${repo}]..."
		any_pkgs=($(getpkgfiles "${STAGING}/*/staging/${repo}/"*-any${PKGEXT} 2>/dev/null))
		for pkgarch in ${ARCHES[@]}; do
			add_pkgs=()
			arch_pkgs=($(getpkgfiles "${STAGING}/*/staging/${repo}/"*-${pkgarch}${PKGEXT} 2>/dev/null))
			for pkg in ${arch_pkgs[@]} ${any_pkgs[@]}; do
				pkgfile="${pkg##*/}"
				msg2 "${pkgfile} (${pkgarch})"
				# any packages might have been moved by the previous run
				if [ -f "${pkg}" ]; then
					mv "${pkg}" "$FTP_BASE/${PKGPOOL}"
				fi
				ln -s "../../../${PKGPOOL}/${pkgfile}" "$FTP_BASE/$repo/os/${pkgarch}"
				# also move signatures
				if [ -f "${pkg}.sig" ]; then
					mv "${pkg}.sig" "$FTP_BASE/${PKGPOOL}"
				fi
				if [ -f "$FTP_BASE/${PKGPOOL}/${pkgfile}.sig" ]; then
					ln -s "../../../${PKGPOOL}/${pkgfile}.sig" "$FTP_BASE/$repo/os/${pkgarch}"
				fi
				add_pkgs[${#add_pkgs[*]}]=${pkgfile}
			done
			if [ ${#add_pkgs[@]} -ge 1 ]; then
				arch_repo_add "${repo}" "${pkgarch}" ${add_pkgs[@]}
			fi
		done
	done

for staging_user in $(ls ${STAGING}); do
	if   [ -d ${STAGING}/${staging_user}/staging/sources ]; then
		srcs_list=( $(ls ${STAGING}/${staging_user}/staging/sources) )
	elif [ -e ${STAGING}/${staging_user}/staging/sources ]; then
		rm -v ${STAGING}/${staging_user}/staging/sources
	fi
	if [[ -n srcs_list ]]; then
		for src in ${srcs_list[@]}; do
			# sources might have been moved by the previous run
			if [ -d ${STAGING}/${staging_user}/staging/sources/${src} ]; then
				src_tarballs=( $(ls ${STAGING}/${staging_user}/staging/sources/${src}) )
				if [[ -n src_tarballs ]]; then
					for src_tarball in ${src_tarballs[@]}; do
						if [ -f ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball} ]; then
							if [[ ${src} = hyperbola ]]; then
								msg2 "${src}/${src_tarball} is a PKGBUILD source code (file or signature)"
								if [ -d $FTP_BASE/sources/${src} ]; then
									if   [ -f $FTP_BASE/sources/${src}/${src_tarball} ]; then
										rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
									elif [ -d $FTP_BASE/sources/${src}/${src_tarball} ]; then
										rm -vr $FTP_BASE/sources/${src}/${src_tarball}
										cp -va ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball} $FTP_BASE/sources/${src}
										rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
									else
										if [ -e $FTP_BASE/sources/${src}/${src_tarball} ]; then
											rm -v $FTP_BASE/sources/${src}/${src_tarball}
										fi
										cp -va ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball} $FTP_BASE/sources/${src}
										rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
									fi
								else
									if [ -e $FTP_BASE/sources/${src} ]; then
										rm -v $FTP_BASE/sources/${src}
									fi
									cp -va ${STAGING}/${staging_user}/staging/sources/${src}                $FTP_BASE/sources
									rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
								fi
						#	else
						#		msg2 "${src}/${src_tarball} is a source code (file or signature)"
						#		if [ -d $FTP_BASE/../../sources/${src} ]; then
						#			if   [ -f $FTP_BASE/../../sources/${src}/${src_tarball} ]; then
						#				rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
						#			elif [ -d $FTP_BASE/../../sources/${src}/${src_tarball} ]; then
						#				rm -vr $FTP_BASE/../../sources/${src}/${src_tarball}
						#				cp -va ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball} $FTP_BASE/../../sources/${src}
						#				rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
						#			else
						#				if [ -e $FTP_BASE/../../sources/${src}/${src_tarball} ]; then
						#					rm -v $FTP_BASE/../../sources/${src}/${src_tarball}
						#				fi
						#				cp -va ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball} $FTP_BASE/../../sources/${src}
						#				rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
						#			fi
						#		else
						#			if [ -e $FTP_BASE/../../sources/${src} ]; then
						#				rm -v $FTP_BASE/../../sources/${src}
						#			fi
						#			cp -va ${STAGING}/${staging_user}/staging/sources/${src}                $FTP_BASE/../../sources
						#			rm -v  ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
						#		fi
							fi
					#	else
					#		msg2 "${src}/${src_tarball} isn't a file"
					#		rm -vr ${STAGING}/${staging_user}/staging/sources/${src}/${src_tarball}
						fi
					done
				fi
			else
				msg2 "${src} isn't a directory"
				rm -v ${STAGING}/${staging_user}/staging/sources/${src}
			fi
		done
	fi
done

for repo in ${repos[@]}; do
	for pkgarch in ${ARCHES[@]}; do
		repo_unlock ${repo} ${pkgarch}
	done
done
