#!/bin/sh ## You can set these variables here or in your enviroment #ARCH='your_CPU_architecture' #SRC_PATH='/path/to/packages/sources' #REPO_PATH='/path/to/archlinux/repo' #REPO_NAME='repo_name' #ARCHIVE_PATH='/path/to/archlinux/archive/repo' ## Search variables URL_PREFIX='https://aur.archlinux.org/' SEARCH_STR='rpc/?v=5&type=search&by=name-desc&arg=' add_packages() { declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mAdding following packages: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do if [ ! -d "${SRC_PATH}/$i" ]; then cd ${SRC_PATH} git clone ${URL_PREFIX}$i.git else echo -e '\033[1;33mWARNING:\033[m Package '"$i"' already present.' fi done } clone_package() { if [ ! -d "${SRC_PATH}/$(echo $1 | awk -F '/' '{print $NF}' | cut -d '.' -f 1)" ]; then echo -e '\033[1;34m:: \033[1;37mCloning url: '"$1"'\033[m' cd ${SRC_PATH} git clone $1 else echo -e '\033[1;33mWARNING:\033[m Package already present.' fi } rm_packages() { declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mRemoving following packages: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do if [ -d "${SRC_PATH}/$i" ]; then rm -rf ${SRC_PATH}/$i else echo -e '\033[1;33mWARNING:\033[m Package '"$i"' not present.' fi done } check_package() { if [ -d "${SRC_PATH}/$1" ]; then ${EDITOR} ${SRC_PATH}/$1/PKGBUILD else echo -e '\033[1;33mWARNING:\033[m Package '"$1"' not found.' fi } list_packages() { if [ -z "$(ls -A ${SRC_PATH})" ]; then echo -e '\033[1;34m:: \033[1;37mNo packages are locally available!\033[m' else echo -e '\033[1;34m:: \033[1;37mPackages locally available:\033[m' find ${SRC_PATH}/* -type d -prune | awk -F '/' '{print $NF}' fi } clean_packages() { if [ "$1" != '' ]; then declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mCleaning following packages: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do find ${SRC_PATH}/$i -type f -iname "*$i*.pkg.tar.zst" -exec rm {} \; done else echo -e '\033[1;34m:: \033[1;37mCleaning all packages\033[m' find ${SRC_PATH} -type f -iname "*.pkg.tar.zst" -exec rm {} \; fi } build_packages() { if [ "$1" != '' ]; then declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mBuilding following packages: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do cd $(find ${SRC_PATH}/* -type d -prune -iname "$i") makepkg -Cs done else echo -e '\033[1;34m:: \033[1;37mBuilding all packages\033[m' for i in $(find ${SRC_PATH}/* -type d -prune) do cd $i makepkg -Cs done fi } upgrade_packages() { if [ "$1" != '' ]; then declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mUpgrading following packages: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do cd $(find ${SRC_PATH}/* -type d -prune -iname "$i") git fetch git diff origin/master git merge makepkg -Cs done else echo -e '\033[1;34m:: \033[1;37mUpgrading all packages\033[m' for i in $(find ${SRC_PATH}/* -type d -prune) do cd $i git fetch git diff origin/master git merge makepkg -Cs done fi } update_packages() { if [ "$1" != '' ]; then declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mUpdating following packages: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do cd $(find ${SRC_PATH}/* -type d -prune -iname "$i") git fetch git diff origin/master git merge done else echo -e '\033[1;34m:: \033[1;37mUpdating all packages\033[m' for i in $(find ${SRC_PATH}/* -type d -prune) do cd $i git fetch git diff origin/master git merge done fi } install_packages() { declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mInstalling following packages: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do if [ -d "${SRC_PATH}/$i" ]; then cd $(find ${SRC_PATH}/* -type d -prune -iname "$i") makepkg -Csi else echo -e '\033[1;33mWARNING:\033[m Package '"$i"' not found.' fi done } update_repo() { if [ "$1" != '' ]; then declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mUpdating following packages in local repository: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do find ${SRC_PATH}/$i -type f -iname "*$i*pkg.tar.zst" -exec cp {} ${REPO_PATH}/${ARCH}/ \; repo-add ${REPO_PATH}/${ARCH}/${REPO_NAME}.db.tar.gz ${REPO_PATH}/${ARCH}/*$i*.pkg.tar.zst done else echo -e '\033[1;34m:: \033[1;37mUpdating all packages in local repository\033[m' find ${SRC_PATH} -type f -iname "*pkg.tar.zst" -exec cp {} ${REPO_PATH}/${ARCH}/ \; repo-add ${REPO_PATH}/${ARCH}/${REPO_NAME}.db.tar.gz ${REPO_PATH}/${ARCH}/*.pkg.tar.zst fi } archive_repo_packages() { if [ "$1" != '' ]; then declare -a pkg=("${!1}") echo -e '\033[1;34m:: \033[1;37mArchiving following packages in local repository: '"${pkg[@]}"'\033[m' for i in "${pkg[@]}"; do find ${REPO_PATH}/${ARCH}/ -type f -iname "*$i*pkg.tar.zst" -exec mv {} ${ARCHIVE_PATH}/${ARCH}/ \; done else echo -e '\033[1;34m:: \033[1;37mArchiving all packages in local repository\033[m' find ${REPO_PATH}/${ARCH}/ -type f -iname "*pkg.tar.zst" -exec mv {} ${ARCHIVE_PATH}/${ARCH}/ \; fi } search_packages() { declare -a key=("${!1}") LIST_INST=$($0 list | tail -n +2 | tr '\n' '|') if [ "$LIST_INST" == '' ]; then LIST_INST=$(head -c 9 /dev/urandom | base32) fi CURL_JSN=$(curl -s $(echo ${URL_PREFIX}${SEARCH_STR}"${key[@]}" | sed -e 's/ /+/g')) OUT_STR=$(jq -r '.results | .[] | [.Name, .Version], .Description' <<< ${CURL_JSN}) SEARCH_OUT=$(sed -e 's/\\//g' -e 's/\[/\\033\[1\;36m\[/g' -e 's/",/\\033\[1\;33m", \[\\033\[1\;32m/g' \ -e 's/\]/\\033\[1\;33m\]\\033\[1\;37m\]/g' <<< ${OUT_STR}) echo -ne '\033[1;34m:: \033[1;37mYou searched using the following keywords (matching package name and/or description): "' echo -ne \\033\[1\;33m${key[@]}\\033\[1\;37m\" echo -e ${SEARCH_OUT} | sed -e 's/\[ /\n/g' -e 's/ *\] /\n\t/g' -e 's/", / /g' -e 's/"//g' | \ sed -E '/'"${LIST_INST::-1}"'[^-]/ s/$/ '"$(echo -e \\033\[1\;35m[ Locally available ]\\033\[1\;37m)"'/' } set_variables() { echo -e '\033[1;33mWARNING:\033[m SRC_PATH variable not set.' echo echo 'You need to set the following variables in your profile:' echo echo " export SRC_PATH='/path/to/packages/sources'" echo " export REPO_PATH='/path/to/archlinux/repo'" echo " export REPO_NAME='repo_name'" echo echo 'The REPO_PATH and REPO_NAME variables are only needed if you use the local repo feature.' echo "Just set the SRC_PATH if you don't intend to use it." } print_help() { echo ''"$0"' SEPPIOFISH repo tool for Archlinux and AUR helper' echo echo ' USAGE: '"$0"' COMMAND PKGNAME(s) (default ALL)' echo echo ' add adds packages from from AUR' echo ' archive archives packages of local repository' echo ' build builds the packages' echo ' check check PKGBUILD' echo ' clean cleans the packages' echo ' cleanbuild cleans the packages anf then builds them' echo ' clone (url) clones git package repository' echo ' help prints this help' echo ' install builds and installs the package' echo ' list lists locally available packages' echo ' rm remove packages' echo ' search searches packages in the AUR' echo ' update updates the packages' echo ' update-repo updates the packages in the repo' echo ' upgrade upgrades and builds the packages' echo if [ "${SRC_PATH}" == '' ];then set_variables fi } if [ "$1" == 'help' ]; then if [ "$2" != '' ]; then echo -e '\033[1;31mERROR:\033[m too many arguments.' else print_help fi elif [ "${SRC_PATH}" == '' ];then set_variables elif [ ! -d "${SRC_PATH}" ]; then echo -e '\033[1;31mERROR:\033[m SRC_PATH variable set to invalid path.' elif [ "$1" == '' ]; then echo -e '\033[1;33mWARNING:\033[m no command called.' elif [ "$1" == 'add' ]; then if [ "$2" == '' ]; then echo -e '\033[1;31mERROR:\033[m missing argument.' else N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done add_packages packages[@] fi elif [ "$1" == 'clone' ]; then if [ "$3" != '' ]; then echo -e '\033[1;31mERROR:\033[m too many arguments.' elif [ "$2" == '' ]; then echo -e '\033[1;31mERROR:\033[m missing argument.' else clone_package $2 fi elif [ "$1" == 'rm' ]; then if [ "$2" == '' ]; then echo -e '\033[1;31mERROR:\033[m missing argument.' else N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done rm_packages packages[@] fi elif [ "$1" == 'check' ]; then if [ "$3" != '' ]; then echo -e '\033[1;31mERROR:\033[m too many arguments.' elif [ "$2" == '' ]; then echo -e '\033[1;31mERROR:\033[m missing argument.' else check_package $2 fi elif [ "$1" == 'list' ]; then if [ "$2" != '' ]; then echo -e '\033[1;31mERROR:\033[m too many arguments.' else list_packages fi elif [ "$1" == 'update-repo' ]; then if [ "${REPO_PATH}" == '' ];then echo -e '\033[1;31mERROR:\033[m REPO_PATH variable not set.' elif [ ! -d "${REPO_PATH}" ]; then echo -e '\033[1;31mERROR:\033[m REPO_PATH variable set to invalid path.' elif [ "${REPO_NAME}" == '' ];then echo -e '\033[1;31mERROR:\033[m REPO_NAME variable not set.' elif [ "${ARCH}" == '' ];then echo -e '\033[1;31mERROR:\033[m ARCH variable not set.' elif [ "$2" != '' ]; then N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done update_repo packages[@] else update_repo fi elif [ "$1" == 'archive' ]; then if [ "${REPO_PATH}" == '' ];then echo -e '\033[1;31mERROR:\033[m REPO_PATH variable not set.' elif [ ! -d "${REPO_PATH}" ]; then echo -e '\033[1;31mERROR:\033[m REPO_PATH variable set to invalid path.' elif [ "${REPO_NAME}" == '' ];then echo -e '\033[1;31mERROR:\033[m REPO_NAME variable not set.' elif [ "${ARCH}" == '' ];then echo -e '\033[1;31mERROR:\033[m ARCH variable not set.' elif [ "${ARCHIVE_PATH}" == '' ];then echo -e '\033[1;31mERROR:\033[m ARCHIVE_PATH variable not set.' elif [ ! -d "${ARCHIVE_PATH}" ]; then echo -e '\033[1;31mERROR:\033[m ARCHIVE_PATH variable set to invalid path.' elif [ "$2" != '' ]; then N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done archive_repo_packages packages[@] else archive_repo_packages fi elif [ "$1" == 'build' ]; then if [ "$2" != '' ]; then N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done build_packages packages[@] else build_packages fi elif [ "$1" == 'cleanbuild' ]; then if [ "$2" != '' ]; then N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done clean_packages packages[@] build_packages packages[@] else clean_packages build_packages fi elif [ "$1" == 'upgrade' ]; then if [ "$2" != '' ]; then N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done upgrade_packages packages[@] else upgrade_packages fi elif [ "$1" == 'update' ]; then if [ "$2" != '' ]; then N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done update_packages packages[@] else update_packages fi elif [ "$1" == 'install' ]; then if [ "$2" == '' ]; then echo -e '\033[1;31mERROR:\033[m missing argument.' else N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done install_packages packages[@] fi elif [ "$1" == 'clean' ]; then if [ "$2" != '' ]; then N=2 while [ "${!N}" != '' ]; do packages[$((N-2))]=${!N} let N=N+1 done clean_packages packages[@] else clean_packages fi elif [ "$1" == 'search' ]; then if [ "$2" == '' ]; then echo -e '\033[1;31mERROR:\033[m missing argument(s).' else N=2 while [ "${!N}" != '' ]; do keywords[$((N-2))]=${!N} let N=N+1 done search_packages keywords[@] fi else echo -e '\033[1;31mERROR:\033[m unrecocnized command.' fi