#!/bin/bash #set -x ### Color Codes RED="\e[31m" GREEN="\e[32m" ENDCOLOR="\e[0m" #find . -not -name "packages.txt" -not -name "clone.sh" -not -name "." -exec rm -rfv {} \; working_directory=$(pwd) mkdir $working_directory/built_packages/ mkdir $working_directory/clone/ function statisfy_dependencies() { for line in "$@"; do cd $working_directory/clone # clone all the packages first echo "Attempting to clone $line..." if ! [ -d $line ]; then timeout 10s git clone https://gitlab.archlinux.org/archlinux/packaging/packages/$line.git cd $working_directory/clone/$line git switch main #git branch -a else cd $working_directory/clone/$line # git pull # git switch main fi done cd $working_directory } function containsElement () { local e match="$1" shift for e in "$@"; do [[ "$e" == "$match" ]] && return 0; done return 1 } readarray first_pass < packages.txt echo $first_pass statisfy_dependencies ${first_pass[@]} depends_array=() makedepends_array=() conflicts_array=() while read line; do # Check each PKGBUILD's dependencies. cd $working_directory/clone/$line # grab depends array # eval $(source PKGBUILD; echo depends=$depends; echo makedepends=$makedepends; echo conflicts=$conflicts) # cache the output of makepkg to a file, since makepkg is slow at parsing the srcinfo data if [[ ! -f $working_directory/clone/$line/.SRCINFO ]]; then makepkg_output=$(makepkg --printsrcinfo ) echo $makepkg_output | tee $working_directory/clone/$line/.SRCINFO else makepkg_output=$(cat $working_directory/clone/$line/.SRCINFO) fi #echo "$makepkg_output" depends=$(echo "$makepkg_output" | grep -w "depends" | sed "s/depends = //g" | xargs) makedepends=$(echo "$makepkg_output" | grep -w "makedepends" | sed "s/makedepends = //g" | xargs) conflicts=$(echo "$makepkg_output" | grep -w "conflicts" | sed "s/conflicts = //g" | xargs) # if we don't have the dependency, we need build it too echo "depends for $line: ${depends[@]}" for depends_element in ${depends[@]}; do containsElement "$depends_element" "${depends_array[@]}" if [[ $? == 1 ]]; then echo "Adding ${depends_element}..." depends_array+=("$depends_element") fi done for depends_element in ${makedepends[@]}; do containsElement "$depends_element" "${depends_array[@]}" if [[ $? == 1 ]]; then echo "Adding ${depends_element}..." depends_array+=("$depends_element") makedepends_array+=("$depends_element") fi done for conflicts_element in ${conflicts[@]}; do containsElement "$conflicts_element" "${conflicts_array[@]}" if [[ $? == 1 ]]; then echo -e "Conflicting elements for $line: ${RED} ${conflicts_element}${ENDCOLOR} ..." conflicts_array+=("${conflicts_element}") fi done done < packages.txt cd $working_directory # Remove these dependencies, they are already taken care of, anyway :P #delete=(gcc-libs glibc appstream-qt futuresql-qt6 cron clang=16.0.6 boost-libs kcachegrind-common kquickimageeditor libkmahjongg marble-common libcolord corrosion flatpak colord cronie kwrite plasma-workspace kgamma5 kdesdk-kioslaves zeroconf-ioslave kalendar) delete=(clang=17.0.6 llvm-libs appstream-qt gcc-libs futuresql-qt6 boost-libs util-linux-libs systemd-libs packagekit-qt6 polkit-qt6 sh mesa-utils mesa-utils libpipewire) for target in "${delete[@]}"; do for i in "${!depends_array[@]}"; do if [[ ${depends_array[i]} = $target ]]; then unset 'depends_array[i]' fi done done echo ${depends_array[@]} statisfy_dependencies ${depends_array[@]} cd $working_directory/clone echo -e "Conflicts detected: ${RED} ${conflicts_array[@]} ${ENDCOLOR}" #read -p "Press Enter to continue..."