#!/usr/bin/env bash
#
#   Script name: makepkg-ubur
#   Description: Script for make package from web aur/ubur UBLinux
#   GitLab: https://gitlab.ublinux.ru/
#   Author: asmeron@ublinux.ru
#   Contributors: asmeron@ublinux.ru
#
#   Copyright (c) 2021-2022 UBLinux Development Team <support@ublinux.ru>
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.

VERSION_SCRIPT=1.5
PACKAGER="asmeron <asmeron@ublinux.com>"    

#set -euo pipefail

## Если скрипт запущен от root, то перезапускаем от пользователя
    if [[ $(id -u) = 0 ]]; then 
	echo -e "\e[1;31mВнимание:\e[0m Скрипт запущен от root, перезапускаю от superadmin!" 
	arg="$@" && sudo -u superadmin /usr/bin/bash -c "$0 ${arg}" 
	exit -1
    fi
    sudo -v


usage() {
  cat <<EOF
Usage: 	${0##*/} [OPTIONS...] [PACKAGE1,PACKAGEn] ...
	${0##*/} [OPTIONS...] [PATH/LISTS.lst] ...
Version: ${VERSION_SCRIPT}
Script for make package from web aur/ubur UBLinux.
Options:
  -p, --packager  [PACKAGES]	Packager name
		  PACKAGES="usermaker <user@mail.ru>"
      --confirm			Спрашивать подтверждения, при сборке пакета
  -n, --nocontainer    	Make package in no container
  -b <СПИСОК>, --bind <СПИСОК>  Cписок каталогов для монтирования в контейнер в формате /SOURCE/DIR1::/TARGET/DIR1,/SOURCE/DIR2::/TARGET/DIR2
  -m <МАСКА>, --mask <МАСКА>	Маска для системных бандлов из которых будет создана aufs для контейнера
      --mlist <МОДУЛЬ1,МОДУЛЬn,ПАПКАn>
				Список модулей и папок для создания aufs, разделитель в списке ","
				В списке можно применять "#" для блокирования. Пример : --mlist 1.${EXT_UBM},#2.${EXT_UBM},3.${EXT_UBM}
      --flist <ПУТЬ_ДО_ФАЙЛА_СПИСКА>
				Список модулей из файла. В файле можно применять "#" для блокирования
				Создать список из модулей в каталоге <КАТАЛОГ>: find <КАТАЛОГ> -name *.${EXT_UBM} |sort |awk '{print "#"$0}' > <КАТАЛОГ>/flist.lst
      --plist <ПУТЬ_ДО_СПИСКА>	Список модулей из папки. Формитруем список из файлов, симлинков и каталогов
				Если каталог существует, то в список модулей попадут все файлы/симлинки/директории из каталога <ПУТЬ_ДО_СПИСКА>
  Если отсутствуют опции -m | --mlist | --flist | --plist, то берутся файлы/симлинки модулей из папки ./modules и файла ./modules/modules.lst
  -f, --forcebuild		Принудительно собрать пакет, не проверять наличие в репозитории
  -d, --forcedownload		Принудительно скачать исходники пакета, перезаписать если существует
  -h, --help            	Show this help
  -V, --version                 Show package version
  
  [PACKAGE1,PACKAGEn]		Packages from aur/ubur user repository
  [PATH/LISTS.lst]		File list packages from aur/ubur user repository
  [blank]			Default all list from the "./uburlist/*.lst"
Meta Commands:
  help          Show this help

Examples:
${0##*/} -p ublinux@mail.com
${0##*/} -p ublinux@mail.com ./uburlist/listpackage.lst
${0##*/} -p ublinux@mail.com --plist ./modules --flist ./modules/modules.lst ./uburlist/listpackage.lst
${0##*/} 
${0##*/} 
EOF
exit 0
}

arguments() {
# Pre-process options to:
# - expand -xyz into -x -y -z
# - expand --longopt=arg into --longopt arg
    local ARGV=()
    local END_OF_OPT=
    while [[ $# -gt 0 ]]; do
	arg="$1"; shift
	case "${END_OF_OPT}${arg}" in
	    --) ARGV+=("$arg"); END_OF_OPT=1 ;;
	    --*=*)ARGV+=("${arg%%=*}" "${arg#*=}") ;;
	    --*) ARGV+=("$arg") ;;
	    -*) for i in $(seq 2 ${#arg}); do ARGV+=("-${arg:i-1:1}"); done ;;
	    *) ARGV+=("$arg") ;;
	esac
    done
# Apply pre-processed options
    set -- "${ARGV[@]}"
# Parse options
    local END_OF_OPT=
    local POSITIONAL_ARGS=()
    [[ -z $@ ]] && usage && exit 0
    while [[ $# -gt 0 ]]; do
	case "${END_OF_OPT}${1}" in
	    -h  | --help | help)   usage ;;
    	    -p  | --packager)      shift; PACKAGER="$1" ;;
    		 --confirm)	   unset NOCONFIRM ;;
	    -m  | --mask) 	   shift; MASK="--mask $1" ;;
	    -b  | --bind) 	   shift; BIND="--bind $1" ;;
		 --mlist) 	   shift; MLIST="--mlist $1" ;;
		 --flist) 	   shift; FLIST="--flist $1" ;;
		 --plist) 	   shift; PLIST="--plist $1" ;;
	    -n  | --nocontainer)   unset BUILD_INCONTAINER ;; 
	    -f  | --forcebuild)	   FORCE_BUILD=1 ;;
	    -d  | --forcedownload) FORCE_DOWNLOAD=1 ;;
	    -q  | --quiet)     	   QUIET=1 ;;
	    -V  | --version)	   echo "Version: ${VERSION_SCRIPT}"; exit 0 ;;
	    --stdin)        	   READ_STDIN=1 ;;
	    --)             	   END_OF_OPT=1 ;;
	    -*  | --*)         	   echo "WARNING: Unrecognized argument, skiped: $1" >&2  ;;
	    *)              	   POSITIONAL_ARGS+=("$1"); OPT_END="$1" ;;
	esac
	shift
    done
# Restore positional parameters
    set -- "${POSITIONAL_ARGS[@]}"
# Default options
    if [[ -z "${MASK}${MLIST}${FLIST}${PLIST}" ]]; then
	PATH_DEF_PLIST="${PATH_WORK}/modules/"
	PATH_DEF_FLIST="${PATH_WORK}/modules/modules.lst"
	[[ -n $(find ${PATH_DEF_PLIST} -print) ]] && PLIST="--plist ${PATH_DEF_PLIST}"
	[[ -f ${PATH_DEF_FLIST} ]] && FLIST="--flist ${PATH_DEF_FLIST}"
    fi 
    [[ -z "${MASK}${MLIST}${FLIST}${PLIST}" ]] && usage
}

_build_container() {
## Preparation container config
    _prep_container() {
	########################################
	#    Chanage distr data
	DISTRIB_NAME="UBLinux"
	#DISTRIB_VERSION="2102"
	#DISTRIB_VERSION="2109"
	#DISTRIB_VERSION="2112"
	DISTRIB_VERSION="2204"
	DISTRIB_ARCH="x86_64"
	DISTRIB_CODENAME="ublinux_db"
	#DISTRIB_CODENAME="ublinux_de"
	#DISTRIB_CODENAME="ublinux_de_adara"
	#DISTRIB_CODENAME="ublinux_de_sibsutis"
	#DISTRIB_CODENAME="ublinux_srv"
	#DISTRIB_CODENAME="ublinux_srv_adara"
	#DISTRIB_CODENAME="ublinux_edu"
	#DISTRIB_CODENAME="ublinux_edu_sibsutis"
	#DISTRIB_CODENAME="ublinux_liveoffice"
	case "${DISTRIB_CODENAME}" in
	    "ublinux_db" )		DISTRIB_CATEGORY="Desktop Basic" ;;
	    "ublinux_de" ) 		DISTRIB_CATEGORY="Desktop Enterprise"  ;;
	    "ublinux_edu" ) 		DISTRIB_CATEGORY="Desktop Education" ;;
	    "ublinux_srv" ) 		DISTRIB_CATEGORY="Server" ;;
	    "ublinux_embedded" ) 	DISTRIB_CATEGORY="Embedded" ;;
	    "ublinux_unknown" ) 	DISTRIB_CATEGORY="Unknown" ;;
	    "ublinux_de_adara" ) 	DISTRIB_CATEGORY="Desktop Enterprise Adara" ;;
	    "ublinux_srv_adara" ) 	DISTRIB_CATEGORY="Server Adara" ;;
	    "ublinux_de_sibsutis")     	DISTRIB_CATEGORY="Desktop Enterprise SibSUTIS" ;;
	    "ublinux_edu_sibsutis")    	DISTRIB_CATEGORY="Desktop Education SibSUTIS" ;;
	    "ublinux_srv_sibsutis")    	DISTRIB_CATEGORY="Server SibSUTIS" ;;
	    "ublinux_liveoffice")     	DISTRIB_CATEGORY="LiveOffice" ;;
	    * )				DISTRIB_CATEGORY="Unknown" ;;
	esac
	local OS_RELEASE_PRETTY_NAME="${DISTRIB_NAME} ${DISTRIB_VERSION} ${DISTRIB_CATEGORY} (${DISTRIB_ARCH})"
	local mirrorlist=$(cat <<EOF
############################################################
## Default config
##
## UBLinux repository mirrorlist
##

Server=https://repo.ublinux.ru/${DISTRIB_VERSION}/\$repo/\$arch
EOF
)
	sudo /usr/lib/ublinux/rc.preinit.d/13-release "${OS_RELEASE_PRETTY_NAME}" "${CONTAINER_ROOT}"
    	[[ -e ${CONTAINER_ROOT}/etc/pacman.d/mirrorlist ]] && sudo mv ${CONTAINER_ROOT}/etc/pacman.d/mirrorlist ${CONTAINER_ROOT}/etc/pacman.d/mirrorlist_backup
	echo "${mirrorlist}" | sudo tee ${CONTAINER_ROOT}/etc/pacman.d/mirrorlist > /dev/null
        echo -e "root:x:0:0::/root:/bin/bash\nnobody:x:65534:65534:Nobody:/:/usr/bin/nologin" | sudo tee ${CONTAINER_ROOT}/etc/passwd &>/dev/null
        echo -e "root:!*:14871::::::\nnobody:!*:18660::::::" | sudo tee ${CONTAINER_ROOT}/etc/shadow &>/dev/null
        echo -e "root:x:0:root\nnobody:x:65534:" | sudo tee ${CONTAINER_ROOT}/etc/group &>/dev/null
        echo -e "root:!*::root\nnobody:!*::nobody" | sudo tee ${CONTAINER_ROOT}/etc/gshadow &>/dev/null
        sudo cp -r /usr/lib/locale/locale-archive ${CONTAINER_ROOT}/usr/lib/locale/
  	sudo cp -r /etc/pacman.conf ${CONTAINER_ROOT}/etc/
	sudo cp -r /etc/makepkg.conf ${CONTAINER_ROOT}/etc/
#	file_work="${CONTAINER_ROOT}/etc/pacman.conf"; vol=$(grep "^#Color" ${file_work})
#	[[ "${vol}" ]] && sudo sed -i 's/^#Color/Color/' ${file_work}
#	file_work="${CONTAINER_ROOT}/etc/pacman.conf"; vol=$(grep "^IgnorePkg" ${file_work}); IGNOREPKG="linux linux-headers linux-docs linux-firmware"
#	([[ "${vol}" ]] && sudo sed -i "s/^IgnorePkg.*/IgnorePkg   = ${IGNOREPKG}/" ${file_work}) || sudo sed -i -e "/^#IgnorePkg.*/{a\IgnorePkg   = ${IGNOREPKG}" -e ":a;n;ba}" ${file_work}
## No check signature
##	SigLevel = Never
##	SigLevel = Required DatabaseOptional
##	SigLevel = Optional TrustAll
	file_work="${CONTAINER_ROOT}/etc/pacman.conf"; vol=$(cat ${file_work} | grep "^\[ublinux\]" -A1)
	[[ "${vol}" && ! $(echo "${vol}" | grep "^SigLevel") ]] && sudo awk -i inplace 'FNR==NR{ if (/\[ublinux\]/) p=NR; next} 1; FNR==p{ print "SigLevel = Never" }' ${file_work} ${file_work}
	file_work="${CONTAINER_ROOT}/etc/pacman.conf"; vol=$(cat ${file_work} | grep "^\[core\]" -A1)
	[[ "${vol}" && ! $(echo "${vol}" | grep "^SigLevel") ]] && sudo awk -i inplace 'FNR==NR{ if (/\[core\]/) p=NR; next} 1; FNR==p{ print "SigLevel = Never" }' ${file_work} ${file_work}
	file_work="${CONTAINER_ROOT}/etc/pacman.conf"; vol=$(cat ${file_work} | grep "^\[extra\]" -A1)
	[[ "${vol}" && ! $(echo "${vol}" | grep "^SigLevel") ]] && sudo awk -i inplace 'FNR==NR{ if (/\[extra\]/) p=NR; next} 1; FNR==p{ print "SigLevel = Never" }' ${file_work} ${file_work}
	file_work="${CONTAINER_ROOT}/etc/pacman.conf"; vol=$(cat ${file_work} | grep "^\[community\]" -A1)
	[[ "${vol}" && ! $(echo "${vol}" | grep "^SigLevel") ]] && sudo awk -i inplace 'FNR==NR{ if (/\[community\]/) p=NR; next} 1; FNR==p{ print "SigLevel = Never" }' ${file_work} ${file_work}
	file_work="${CONTAINER_ROOT}/etc/pacman.conf"; vol=$(cat ${file_work} | grep "^\[multilib\]" -A1)
	[[ "${vol}" && ! $(echo "${vol}" | grep "^SigLevel") ]] && sudo awk -i inplace 'FNR==NR{ if (/\[multilib\]/) p=NR; next} 1; FNR==p{ print "SigLevel = Never" }' ${file_work} ${file_work}
	echo 'ALL ALL=(ALL:ALL) NOPASSWD: ALL' | sudo tee --append "${CONTAINER_ROOT}/etc/sudoers.d/allnopasswd" > /dev/null
	sudo rm -f ${CONTAINER_ROOT}/usr/share/libalpm/hooks/90-packagekit-refresh.hook
	printf '%s.UTF-8 UTF-8\n' en_US ru_RU | sudo tee  "${CONTAINER_ROOT}/etc/locale.gen" > /dev/null
	echo 'LANG=ru_RU.UTF-8' | sudo tee  "${CONTAINER_ROOT}/etc/locale.conf" > /dev/null
	sudo rm -f ${CONTAINER_ROOT}/etc/lsb-release
    }
    CONTAINER_NAME="${PKGNAME}-${RANDOM:0:4}"
#CONTAINER_NAME="${PKGNAME}-3219"
    CONTAINER_ROOT="/memory/aufs-${CONTAINER_NAME}"
    PACMAN_ROOT="--sysroot ${CONTAINER_ROOT}"
    DEPS_PACKAGE1="archlinux-keyring ublinux-keyring ublinux-sysusers"
#    sudo ubcontainer --showlayers --mlist ${CONTAINER_MODULE}

    sudo ubcontainer --build --name "${CONTAINER_NAME}" --type nspawn "${MASK}" "${MLIST}" "${FLIST}" "${PLIST}" --mlist ${CONTAINER_MODULE}
    [[ ! -d /memory/aufs-${CONTAINER_NAME} ]] && echo -e "\e[1;31mWARNING:\e[0m container path /memory/aufs-${CONTAINER_NAME} not found " | tee -a "${BUILD_LOG}" && exit 1
    _prep_container
    sudo install -dm777 /memory/aufs-${CONTAINER_NAME}${BUILDDIR} /memory/aufs-${CONTAINER_NAME}${PKGDEST} /memory/aufs-${CONTAINER_NAME}${SRCDEST} /memory/aufs-${CONTAINER_NAME}${SRCPKGDEST} /memory/aufs-${CONTAINER_NAME}${LOGDEST}
    sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LANG="$LANG" bash -c " \
	sudo locale-gen &>/dev/null; \
	sudo pacman -Syy &>/dev/null; \
	sudo pacman --needed --noconfirm -S archlinux-keyring ublinux-keyring &>/dev/null"
    sudo pacstrap -GMC ${CONTAINER_ROOT}/etc/pacman.conf "${CONTAINER_ROOT}" ${DEPS_PACKAGE1}
}

_localrepo() {
# $1 mode
# $2 name package, without ext
    local FILE_PKG=
    local NAME_LOCALREPO="local-ubur"
    local PATH_LOCALREPO="${PATH_PKGDEST}"
    [[ -z ${BUILD_INCONTAINER} ]] && local PATH_PACMAN="/etc/pacman.conf" || local PATH_PACMAN="${CONTAINER_ROOT}/etc/pacman.conf"
    case "$1" in
	"init" )
	    if ! grep -q "\[${NAME_LOCALREPO}\]" ${PATH_PACMAN}; then 
    		echo | sudo tee -a ${PATH_PACMAN} >/dev/null
		echo "[${NAME_LOCALREPO}]"  | sudo tee -a ${PATH_PACMAN} >/dev/null
		echo "SigLevel = Optional" | sudo tee -a ${PATH_PACMAN} >/dev/null
		echo "Server = file://${PATH_LOCALREPO}" | sudo tee -a ${PATH_PACMAN} >/dev/null
	    fi
	    local PATH_PKG_TAR=""
	    if [[ -z $(find ${PATH_LOCALREPO}/ -maxdepth 1 -iname "${NAME_LOCALREPO}.db.tar.gz" -print) ]]; then
	       [[ -n $(find ${PATH_LOCALREPO}/ -maxdepth 1 -iname "*.pkg.tar*" -print) ]] && PATH_PKG_TAR="${PATH_PKGDEST}/*.pkg.tar*"
	        sudo repo-add -q -n ${PATH_LOCALREPO}/${NAME_LOCALREPO}.db.tar.gz ${PATH_PKG_TAR}
	    fi
	    [[ -z ${BUILD_INCONTAINER} ]] && sudo pacman -Sy &>/dev/null || \
		sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LC_CTYPE="$LC_CTYPE" --bind=${PATH_PKGDEST} pacman -Sy &>/dev/null
	;;
	"add" )
	    if [[ -n "$2" ]]; then
		local PATH_PKGBUILD="${PATH_PKGSRC}/$2"
		PKGBUILD_PKGNAME="$(cat ${PATH_PKGBUILD}/.SRCINFO | grep -e "pkgname =" | cut -d= -f2 | tr -d " <=>" | sort -u)"
		for i in ${PKGBUILD_PKGNAME}; do 
		    if [[ -n $(find ${PATH_PKGDEST}/ -maxdepth 1 -iname "${i}*.pkg.tar*" -print) ]]; then
			[[ -z ${FORCE_BUILD} ]] && local ONLY_UPDATE="-n"
			sudo repo-add -q ${ONLY_UPDATE} ${PATH_LOCALREPO}/${NAME_LOCALREPO}.db.tar.gz ${PATH_PKGDEST}/${i}*.pkg.tar*
		    fi
		done
	    fi
	    [[ -z ${BUILD_INCONTAINER} ]] && sudo pacman -Sy &>/dev/null || \
#		sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LC_CTYPE="$LC_CTYPE" --bind=${PATH_PKGDEST} pacman -Sy &>/dev/null
		sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LC_CTYPE="$LC_CTYPE" pacman -Sy &>/dev/null
	;;
	"remove" )
	    [[ -z ${BUILD_INCONTAINER} ]] && sudo sed -i "/^\[${NAME_LOCALREPO}\]/,/^Server/d" ${PATH_PACMAN}
	;;
	* )
	    echo | tee -a "${BUILD_LOG}"
	;;
    esac
}

_get_pkgbuild() {
    _get_sources_pkgbuild() {
	cd ${PATH_PKGSRC}/${BASEPKG_NAME}/ 
	makepkg -g -p PKGBUILD #2>/dev/null
    	updpkgsums ${PATH_PKGSRC}/${BASEPKG_NAME}/PKGBUILD    
    }
    BASEPKG_NAME="$1"
    [[ -f ${PATH_PKGSRC}/${BASEPKG_NAME}/PKGBUILD && -z ${FORCE_DOWNLOAD} ]] && return 0
    local SNAPSHOT_NAME=$(wget -qO- https://aur.archlinux.org/packages/${1} 2>/dev/null | grep -Po '(?<=href=")/cgit/aur.git/snapshot/[^"]*' | head -1) #"
    if [[ -n ${SNAPSHOT_NAME} ]]; then
	SNAPSHOT_NAME="https://aur.archlinux.org${SNAPSHOT_NAME}"
	BASEPKG_NAME=${SNAPSHOT_NAME##*/}; BASEPKG_NAME=${BASEPKG_NAME%.tar.gz}
        wget -qN -P ${PATH_PKGSRC}/${BASEPKG_NAME} ${SNAPSHOT_NAME} && \
	    tar -xf ${PATH_PKGSRC}/${BASEPKG_NAME}/${BASEPKG_NAME}.tar.gz -C ${PATH_PKGSRC}/${BASEPKG_NAME} --strip-components 1 && \
	    chmod -R uog+w ${PATH_PKGSRC}/${BASEPKG_NAME}
	[[ ! -f ${PATH_PKGSRC}/${BASEPKG_NAME}/${BASEPKG_NAME}.tar.gz ]] && echo "ERROR: ${BASEPKG_NAME} package not found in ${SNAPSHOT_NAME}" | tee -a "${BUILD_LOG}" && return 1
	_get_sources_pkgbuild
	PACKAGE=${BASEPKG_NAME}
    else
	if [[ -f ${PATH_PKGSRC}/${BASEPKG_NAME}/PKGBUILD ]]; then 
	    _get_sources_pkgbuild
	else
	    echo "ERROR: ${1} package not found."  | tee -a "${BUILD_LOG}"
	    return 1
	fi
    fi
}

_find_packages() {
# Блок для поиска имен установленного пакета, или имен установленных пакетов в одном PKGBUILD
#############
# Блок более быстрый, т.к. ищит один пакет от имени папки сборки. имя_пакета_из_PKGBUILD = пакет
    local PATH_PKGBUILD="$1"
    PKGBUILD_PKGNAME="$(cat ${PATH_PKGBUILD}/.SRCINFO | grep -e "pkgname =" | cut -d= -f2 | tr -d " <=>" | sort -u)"
    PKGBUILD_PKGVER="$(cat ${PATH_PKGBUILD}/.SRCINFO | grep -e "pkgver =" | cut -d= -f2 | tr -d " <=>" | sort -u | head -1)"
    PKGBUILD_PKGREL="$(cat ${PATH_PKGBUILD}/.SRCINFO | grep -e "pkgrel =" | cut -d= -f2 | tr -d " <=>" | sort -u | head -1)"
    for i in ${PKGBUILD_PKGNAME}; do 
# Сделать поиск по имени и версии пакета
# Сейчас только по имени
#	expac -s "%n %v" arj
 	sudo pacman ${PACMAN_ROOT} -Ss "^${i}\$" | grep "${PKGBUILD_PKGVER}-${PKGBUILD_PKGREL}" > /dev/null || return 1
#	pacman ${PACMAN_ROOT} -qSs "^${i}\$" 1> /dev/null && echo "${i}" || return 1
    done
#############
# Блок медленный т.к. долго отрабатывает makepkg --packagelist - выводя говорые имена нескольких пакетов из одного PKGBUILD
# имя_пакетов_из_PKGBUILD = пакет
#    local PATH_PKGBUILD="$1"
#    local PACKAGES=$(cd ${PATH_PKGBUILD} && makepkg --packagelist)
#    local PACKAGE
#    for PACKAGE in ${PACKAGES}; do 
##	[[ ! -f "${PATH_PKGDEST}/${PACKAGE##*/}" ]] && return 1
#	PACKAGE=${PACKAGE##*/}; PACKAGE=${PACKAGE%*-*-*-*.${EXT_PKG}}
#	[[ -z $(sudo pacman ${PACMAN_ROOT} -qSs "^${PACKAGE}\$") ]] && return 1
#    done
#############
# Блок более быстрый, т.к. ищит один пакет от имени папки сборки. имя_пакета_из_аргументов = пакет
#    local PATH_PKGBUILD="$1"
#    local PKGBUILD_PKGBASE
#    PKGBUILD_BASE="$(cat ${PATH_PKGBUILD}/.SRCINFO | grep -e "pkgbase =" | cut -d= -f2 | tr -d " <=>")"
#    [[ -z $(sudo pacman ${PACMAN_ROOT} -qSs "^${PACKAGE}\$") ]] && return 1
    return 0
}

_pkgbuild_install_deps() {
    local PATH_PKGBUILD=$1
    local PKGBUILD_DEPS
    local PKGBUILD_PKGNAME
    PKGBUILD_DEPS="$(cat ${PATH_PKGBUILD}/.SRCINFO | grep -e $'\t'"depends =" -e $'\t'"makedepends = " | cut -d= -f2 | tr -d " <=>" | sort -u)"
    PKGBUILD_PKGNAME="$(cat ${PATH_PKGBUILD}/.SRCINFO | grep -e "pkgname =" | cut -d= -f2 | tr -d " <=>" | sort -u)"
# Удаляем из зависимостей имена текущих пакетов, что-бы избежать циклическую зависимость
    for i in ${PKGBUILD_PKGNAME}; do 
        PKGBUILD_DEPS=$(echo "${PKGBUILD_DEPS}" | sed "/^${i}\$/d")
    done
# Все найденные зависимости проверить на доступность в репозитории, если зависимость в AUR/UBUR, собрать, и добавить во временную  пакетную базу
    for PKGBUILD_DEP in ${PKGBUILD_DEPS}; do 
	if [[ -z $(sudo pacman ${PACMAN_ROOT} -qSs "^${PKGBUILD_DEP}\$") ]]; then
	    echo "WARNING: ${PKGBUILD_DEP} depend not found." | tee -a "${BUILD_LOG}"
# Собрать звисимость
	    local ARGS=""
	    [[ -z ${NOCONFIRM} ]] && ARGS+="--confirm "
#	    [[ -n ${PACKAGER} ]] && ARGS+="--packager \"${PACKAGER}\" "
#	    [[ -n ${MASK} ]] && ARGS+="${MASK} "
#    	    [[ -n ${BIND} ]] && ARGS+="${BIND} "
#	    [[ -n ${MLIST} ]] && ARGS+="${MLIST} "
#	    [[ -n ${FLIST} ]] && ARGS+="${FLIST} "
#	    [[ -n ${PLIST} ]] && ARGS+="${PLIST} "
#	    [[ -n ${} ]] && ARGS+="${} "
	    echo "INFO: ${PATH_WORK}/${PKGNAME} ${ARGS} ${PKGBUILD_DEP}" | tee -a ${BUILD_LOG}
	    "${PATH_WORK}/${PKGNAME}" "${ARGS}" "${PKGBUILD_DEP}"
	    [[ -z ${BUILD_INCONTAINER} ]] && sudo pacman -Sy &>/dev/null || \
#		sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LC_CTYPE="$LC_CTYPE" --bind=${PATH_PKGDEST} pacman -Sy &>/dev/null
		sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LC_CTYPE="$LC_CTYPE" pacman -Sy &>/dev/null
	fi
    done
}

##################
##	MAIN	##
##################
#    PKGNAME=$(basename ${0%.*})
    PKGNAME=${0##*/}
#    PATH_WORK=$(realpath ${0%/*})
    PATH_WORK=${PWD}
    EXT_UBM="ubm"
    EXT_PKG="pkg.tar.zst"

    PATH_PKGSRC="${PATH_WORK}/sources"
    PATH_PKGDEST="${PATH_WORK}/packages"
    PATH_UBUR_LIST="${PATH_WORK}/uburlist"
    BUILD_LOG="${PATH_WORK}/${PKGNAME}.log"

    PATH_CONT_PKGSRC="/startdir"
## Paths makepkg for container 
#    BUILDDIR="/var/pkg/makepkg"
    BUILDDIR="/build"
    PKGDEST="/var/pkg/packages"
    SRCDEST="/var/pkg/sources"
    SRCPKGDEST="/var/pkg/srcpackages"
    LOGDEST="/var/pkg/makepkglogs"
##
#    WEB_SRC_PKGBUILD="https://aur.archlinux.org/cgit/aur.git/snapshot"
    BUILD_INCONTAINER="1"
    NOCONFIRM="--noconfirm"
    
    arguments $@
    echo 'ALL ALL=(ALL:ALL) NOPASSWD: ALL' | sudo tee --append /etc/sudoers.d/allnopasswd > /dev/null
    sudo install -dm777 ${PATH_PKGSRC} ${PATH_PKGDEST}
    sudo install -dm777 ${BUILDDIR} ${PKGDEST} ${SRCDEST} ${SRCPKGDEST} ${LOGDEST}
    if [[ -z ${OPT_END} ]]; then
	FILES_LIST="$(find ${PATH_UBUR_LIST} -maxdepth 1 -iname "*.lst" -print)"
    else 
	if [[ ! -f "${OPT_END}" ]]; then 
	    FILES_LIST=$(mktemp /tmp/${OPT_END##*/}.XXXX)
	    echo "${OPT_END}" > ${FILES_LIST}
	else 
	    FILES_LIST="${OPT_END}"
	fi
    fi
    for FILE_LIST in ${FILES_LIST}; do
	BUILD_LOG="${PATH_WORK}/${FILE_LIST##*/}.log"
	echo "$(date)" | tee "${BUILD_LOG}"
        echo "Application List: ${FILE_LIST}" | tee -a "${BUILD_LOG}"
	LIST_PACKAGE=$(echo $(cat ${FILE_LIST} | grep -v "^\s*#"))
	[[ -n ${BUILD_INCONTAINER} ]] && _build_container 
	_localrepo init
#debug
#sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LC_CTYPE="$LC_CTYPE" --bind=${PATH_PKGSRC}/${PACKAGE}:/tmp/${PKGNAME} --bind=${PATH_PKGDEST} bash

	for PACKAGE in ${LIST_PACKAGE}; do
	    echo "PACKAGE: ${PACKAGE}" | tee -a ${BUILD_LOG}
	    BASEPKG_NAME=
	    _get_pkgbuild ${PACKAGE} || continue	    
	    [[ ! -f "${PATH_PKGSRC}/${PACKAGE}/.SRCINFO" || -n ${FORCE_BUILD} ]] && cd ${PATH_PKGSRC}/${PACKAGE} && makepkg --printsrcinfo > .SRCINFO
	    if [[ -z ${FORCE_BUILD} ]] && _find_packages "${PATH_PKGSRC}/${PACKAGE}"; then
#	    if [[ -z ${FORCE_BUILD} && $(sudo pacman ${PACMAN_ROOT} -Ss "^${PACKAGE}\$") ]]; then
		echo "INFO: ${PACKAGE} package found." | tee -a "${BUILD_LOG}"
	    else
		echo "WARNING: Pacman did not find the package: ${PACKAGE}." | tee -a "${BUILD_LOG}"
		if [[ ${PACKAGE} != ${BASEPKG_NAME} ]]; then 
		    echo "INFO: base package \"${BASEPKG_NAME}\" from \"${PACKAGE}\" package." | tee -a "${BUILD_LOG}"
		    PACKAGE=${BASEPKG_NAME}
		fi
		_pkgbuild_install_deps ${PATH_PKGSRC}/${PACKAGE}
#debug
#sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M ${CONTAINER_NAME} --setenv=LC_CTYPE="$LC_CTYPE" --bind=${PATH_PKGSRC}/${PACKAGE}:/tmp/${PKGNAME} --bind=${PATH_PKGDEST} bash
#[[ -n ${BUILD_INCONTAINER} ]] && sudo ubcontainer --destroy --name "${CONTAINER_NAME}"
#exit 0
#continue
		if [[ -n ${BUILD_INCONTAINER} ]]; then 
		    sudo systemd-nspawn -D "/memory/aufs-${CONTAINER_NAME}" -M "${CONTAINER_NAME}" --setenv=LC_CTYPE="$LC_CTYPE" --bind="${PATH_PKGSRC}/${PACKAGE}:${PATH_CONT_PKGSRC}" --bind="${PATH_PKGDEST}" sudo -u nobody bash -c \
	    		"cd \"${PATH_CONT_PKGSRC}\" && PACKAGER=\"${PACKAGER}\" BUILDDIR=\"${BUILDDIR}\" PKGDEST=\"${PATH_PKGDEST}\" SRCDEST=\"${SRCDEST}\" SRCPKGDEST=\"${SRCPKGDEST}\" LOGDEST=\"${LOGDEST}\" makepkg -cCrsf --skippgpcheck --skipinteg ${NOCONFIRM} PKGBUILD" \
	    		|| echo "ERROR: Package ${PACKAGE} not build." | tee -a ${BUILD_LOG}
	    	else
	    	    cd "${PATH_CONT_PKGSRC}" && PACKAGER="${PACKAGER}" BUILDDIR="${BUILDDIR}" PKGDEST="${PATH_PKGDEST}" SRCDEST="${SRCDEST}" SRCPKGDEST="${SRCPKGDEST}" LOGDEST="${LOGDEST}" makepkg -cCrsf --skippgpcheck --skipinteg ${NOCONFIRM} PKGBUILD \
	    		|| echo "ERROR: Package ${PACKAGE} not build." | tee -a ${BUILD_LOG}
	    	fi
	    	_localrepo add "${PACKAGE}"
	    fi
	done
	[[ -n ${BUILD_INCONTAINER} ]] && sudo ubcontainer --destroy --name "${CONTAINER_NAME}"
	_localrepo remove
    done
    find /tmp/ -maxdepth 1 -iname "${FILES_LIST##*/}" -delete
