#!/bin/sh -efu

. gb-sh-functions

fail_if_task_abort_requested

i="$1"; shift

handle_build_arch()
{
	local srpm="$1"; shift
	local arch="$1"; shift
	local exclude_arch exclusive_arch

	exclude_arch="$(rpmquery --qf '[%{excludearch}\n]' -p "$srpm")"
	if [ -n "$exclude_arch" ] && printf '%s\n' "$exclude_arch" |fgrep -qx "$arch"; then
		printf "%s: Architecture is excluded: %s\n" "${srpm##*/}" "$arch" >excluded
		return
	fi

	exclusive_arch="$(rpmquery --qf '[%{exclusivearch}\n]' -p "$srpm")"
	if [ -n "$exclusive_arch" ] && ! printf '%s\n' "$exclusive_arch" |fgrep -qx "$arch"; then
		printf "%s: Architecture is not included: %s\n" "${srpm##*/}" "$arch" >excluded
		return
	fi
}

. gb-sh-tmpdir

pocket=
pocket_conf=
if [ -f gears/$i/copy_pocket ]; then
	pocket=$(cat gears/$i/copy_pocket)
	pocket_conf="$GB_POCKETS_DIR/$pocket/files/pocket/gb-sh-conf"
fi

repo="$(cat gears/$i/copy_repo)"
repo_conf="$GB_CONF_DIR/gb-sh-conf-$repo"
repo_dir="$(unset GB_REPO_DIR &&
	    . $repo_conf &&
	    printf %s "$GB_REPO_DIR")"
repo_use_files="$(unset GB_REPO_USE_FILES &&
	    . $repo_conf &&
	    printf %s "${GB_REPO_USE_FILES-yes}")"
repo_flavour="$(unset GB_REPO_FLAVOUR &&
	    . $repo_conf &&
	    printf %s "$GB_REPO_FLAVOUR")"
repo_arch="$(unset GB_ARCH &&
	    . $repo_conf &&
	    printf %s "${GB_ARCH-i586 x86_64}")"

if [ -n "$pocket" ]; then
	repo="$(cat $GB_POCKETS_DIR/$pocket/files/pocket/repo)"
	repo_dir="$(unset GB_REPO_DIR &&
		    . $repo_conf &&
		    . $pocket_conf &&
		    printf %s "$GB_REPO_DIR")"
	repo_use_files="$(unset GB_REPO_USE_FILES &&
		    . $repo_conf &&
		    . $pocket_conf &&
		    printf %s "${GB_REPO_USE_FILES-yes}")"
	repo_flavour="$(unset GB_REPO_FLAVOUR &&
		    . $repo_conf &&
		    . $pocket_conf &&
		    printf %s "$GB_REPO_FLAVOUR")"
	repo_arch="$(unset GB_ARCH &&
		    . $repo_conf &&
		    . $pocket_conf &&
		    printf %s "${GB_ARCH-i586 x86_64}")"
fi

cd "$tmpdir"
if [ -z "$pocket" ]; then
	make_repo_table "$repo"
else
	make_repo_table -p "$pocket" "$repo"
fi
cd - >/dev/null

# output: src-F  bin-A  bin-F
join -t$'\t' -o '1.3 1.6 1.7' -- "$tmpdir/$repo" "gears/$i/package" >"$tmpdir/copy"
sort -u -o "$tmpdir/copy"{,}
if [ ! -s "$tmpdir/copy" ]; then
	stamp_echo >&2 "package \`$(cat "gears/$i/package")' not found in \`$repo', copy FAILED"
	exit 1
fi
cut -f1 "$tmpdir/copy" |sort -u >"$tmpdir/copy.src"
cut -f3 "$tmpdir/copy" |sort -u >"$tmpdir/copy.bin"

# remove previously copied packages if any
rm -rf "build/$i"

while read -r S; do
	for arch in $GB_ARCH; do
		(umask 002; mkdir -p "build/$i/$arch") || false
		cd "build/$i/$arch"
		rm -f excluded
		if use_repo_files "$repo_use_files"; then
			handle_build_arch "$repo_dir/files/SRPMS/$S" "$arch"
		else
			handle_build_arch "$repo_dir/$arch/SRPMS.$repo_flavour/$S" "$arch"
		fi
		cd - >/dev/null
	done
done <"$tmpdir/copy.src"

while read -r S A B; do
	a="$A"
	if [ "$A" = 'noarch' ]; then
		a="$GB_ARCH"
	fi
	for arch in $a; do
		[ -d "build/$i/$arch" ] || continue
		cd "build/$i/$arch"
		if [ ! -s excluded ]; then
			if use_repo_files; then
				s="$(readlink -ev "$repo_dir/files/SRPMS/$S")"
				b="$(readlink -ev "$repo_dir/files/$A/RPMS/$B")"
			else
				s="$(readlink -ev "$repo_dir/$A/SRPMS.$repo_flavour/$S")"
				b="$(readlink -ev "$repo_dir/$A/RPMS.$repo_flavour/$B")"
			fi
			(umask 002; mkdir -p srpm rpms) || false
			cp -v -l "$s" srpm/ >>log 2>&1 || cp -v "$s" srpm/ >>log 2>&1
			cp -v -l "$b" rpms/ >>log 2>&1 || cp -v "$b" rpms/ >>log 2>&1
		fi
		cd - >/dev/null
	done
done <"$tmpdir/copy"

for arch in ${GB_AREPO_ARCH-}; do
	a="$repo_dir/files/list/arepo-$arch.list"
	[ -s "$a" ] || continue
	sort -k4,4 "$a" > "$tmpdir/arepo.list"
	join -t$'\t' -1 1 -2 4 -o 2.1,2.3 "$tmpdir/copy.bin" "$tmpdir/arepo.list" > "$tmpdir/copy.arepo"
	[ -s "$tmpdir/copy.arepo" ] || continue
	(umask 002; mkdir "build/$i/$arch" "build/$i/$arch/rpms") || false
	cd "build/$i/$arch"
	sort -u "$tmpdir/copy.arepo" > copy.list
	while read -r N B; do
		if use_repo_files; then
			b="$(readlink -ev "$repo_dir/files/$arch/RPMS/$B")"
		else
			b="$(readlink -ev "$repo_dir/$arch/RPMS.$repo_flavour/$B")"
		fi
		cp -v -l "$b" rpms/ >> log 2>&1
	done < copy.list
	cd - >/dev/null
done

for a in $GB_ARCH; do
	gb-task-copy-remote-arch-i $a $i
done

stamp_echo >&2 "copy from \`$repo': $(join -t$'\t' -o 1.3 -- "$tmpdir/$repo" "gears/$i/package" |sort -u)"
