| | |
| | | #!/bin/bash |
| | | #A basic bash script to automate the building of arch packages |
| | | # Usage: main.sh init|add|build_all [-f force] |
| | | # Usage: main.sh init|check|add|remove|build_all |
| | | |
| | | source $(dirname "$(realpath $0)")/vars.sh |
| | | |
| | | ERRORFILE=$(mktemp) |
| | | WAITLIST=$(mktemp) |
| | | WAITLIST_LCK=$(mktemp) |
| | | |
| | | #Helper for finding newest and oldest files |
| | | #Sourced from stack overflow |
| | |
| | | # Usage: build_pkg [package name] [-f force] |
| | | function build_pkg { |
| | | #check if PKGBUILD has updated, don't rebuild if hasn't changed |
| | | if [[ ! -z $(git pull | grep "Already up to date.") && -z $(grep 'pkgver() {' PKGBUILD) && -z $2 ]]; then |
| | | if [[ -n "$(git pull | grep 'Already up to date.')" && -z "$(grep 'pkgver() {' PKGBUILD)" && -z "$2" ]]; then |
| | | return 2 |
| | | fi |
| | | |
| | |
| | | fi |
| | | if [[ $? != 0 ]]; then |
| | | #Register error |
| | | echo $1 >> $REPODIR/.errors |
| | | echo $1 >> $ERRORFILE |
| | | return 1 |
| | | fi |
| | | |
| | |
| | | |
| | | # Add package to waiting list to be added to repo db |
| | | while true; do |
| | | if [[ $(cat $REPODIR/.waitlist.lck) == 1 ]]; then |
| | | if [[ $(cat $WAITLIST_LCK) == 1 ]]; then |
| | | sleep 1 |
| | | else |
| | | echo 1 > $REPODIR/.waitlist.lck |
| | | echo $1 >> $REPODIR/.waitlist |
| | | echo 0 > $REPODIR/.waitlist.lck |
| | | echo 1 > $WAITLIST_LCK |
| | | echo $1 >> $WAITLIST |
| | | echo 0 > $WAITLIST_LCK |
| | | break |
| | | fi |
| | | done |
| | | while true; do |
| | | # Wait until package is at the top of the queue and add to db |
| | | if [[ "$(head -n1 $REPODIR/.waitlist)" == "$1" ]]; then |
| | | if [[ "$(head -n1 $WAITLIST)" == "$1" ]]; then |
| | | # for i in ${pkgs[@]}; do |
| | | repo-add $([[ "$SIGN" == "Y" ]] && echo "--sign --key $KEY") $REPODIR/$REPONAME.db.tar.$([ -n "$COMPRESSION" ] || echo $COMPRESSION && echo zst) ${pkgs[@]} |
| | | # done |
| | | while true; do |
| | | if [[ $(cat $REPODIR/.waitlist.lck) == 1 ]]; then |
| | | if [[ $(cat $WAITLIST_LCK) == 1 ]]; then |
| | | sleep 1 |
| | | else |
| | | # Remove self from top of queue |
| | | echo 1 > $REPODIR/.waitlist.lck |
| | | tail -n +2 $REPODIR/.waitlist > $REPODIR/.waitlist.tmp |
| | | mv $REPODIR/.waitlist.tmp $REPODIR/.waitlist |
| | | echo 0 > $REPODIR/.waitlist.lck |
| | | echo 1 > $WAITLIST_LCK |
| | | TEMP=$(mktemp) |
| | | tail -n +2 $WAITLIST > $TEMP |
| | | cp $TEMP $WAITLIST |
| | | rm $TEMP |
| | | unset TEMP |
| | | echo 0 > $WAITLIST_LCK |
| | | break |
| | | fi |
| | | done |
| | | break |
| | | else |
| | | if [[ -z "$(grep $1 $REPODIR/.waitlist)" ]]; then |
| | | if [[ -z "$(grep $1 $WAITLIST)" ]]; then |
| | | # Not on waitlist for some reason, need to readd |
| | | if [[ $(cat $REPODIR/.waitlist.lck) == 1 ]]; then |
| | | if [[ $(cat $WAITLIST_LCK) == 1 ]]; then |
| | | sleep 1 |
| | | else |
| | | echo 1 > $REPODIR/.waitlist.lck |
| | | echo $1 >> $REPODIR/.waitlist |
| | | echo 0 > $REPODIR/.waitlist.lck |
| | | echo 1 > $WAITLIST_LCK |
| | | echo $1 >> $WAITLIST |
| | | echo 0 > $WAITLIST_LCK |
| | | fi |
| | | fi |
| | | sleep 10 |
| | |
| | | sudo pacman -Syu --noconfirm |
| | | fi |
| | | |
| | | #Remove waitlist and errors from old builds |
| | | rm -f $REPODIR/{.waitlist,.errors} |
| | | #update every package currently stored |
| | | for d in $(find $BUILDDIR -maxdepth 1 -mindepth 1 -type d) |
| | | do |
| | |
| | | rmlist="$rmlist $(comm -12 <(pacman -Slq $REPONAME | sort) <(pacman -Slq core | sort) | tr '\n' ' ')" |
| | | rmlist="$rmlist $(comm -12 <(pacman -Slq $REPONAME | sort) <(pacman -Slq extra | sort) | tr '\n' ' ')" |
| | | rmlist="$rmlist $(comm -12 <(pacman -Slq $REPONAME | sort) <(pacman -Slq community | sort) | tr '\n' ' ')" |
| | | removed=() |
| | | TMPFILE=$(mktemp) |
| | | for i in $(find $BUILDDIR -mindepth 1 -maxdepth 1 -type d); do |
| | | check_pkg $TMPFILE "$(echo $i | rev | cut -d'/' -f1 | rev)" & |
| | |
| | | "check") |
| | | check;; |
| | | *) |
| | | printf "Invalid usage\nUsage: $0 init|add|build-all|check\n";; |
| | | echo -e "\033[0;31mInvalid usage\033[0m" |
| | | echo -e "Usage: $0 init|check|add|remove|build-all" |
| | | echo -e "\033[0;32minit\033[0m - initialise repository for use" |
| | | echo -e "\033[0;32mcheck\033[0m - check if packages have been moved into the official repositories or removed from the AUR" |
| | | echo -e "\033[0;32madd package ...\033[0m - add a package to \$BUILDDIR and repository, also used to rebuild failed packages" |
| | | echo -e "\033[0;32mremove -a | package ...\033[0m - remove package from \$BUILDDIR and repository, \"-a\" removes packages added to official repos" |
| | | echo -e "\033[0;32mbuild-all [-f]\033[0m - build all packages in \$BUILDDIR, \"-f\" force builds whole repository" |
| | | esac |
| | | |
| | | # Error reporting, send email only for build-all as assuming an batch job for that |
| | | if [[ $1 == "build-all" || $1 == "add" ]]; then |
| | | if [[ -f $REPODIR/.errors ]]; then |
| | | ERRORS=$(cat $REPODIR/.errors | tr '\n' ' ') |
| | | rm $REPODIR/.errors |
| | | if [[ -n $(cat $ERRORFILE) ]]; then |
| | | ERRORS=$(cat $ERRORFILE | tr '\n' ' ') |
| | | echo "Errors in packages: $ERRORS" |
| | | if [[ "$EMAIL" != "" && "$1" == "build-all" ]]; then |
| | | send_email $ERRORS |
| | |
| | | echo "All packages built successfully" |
| | | fi |
| | | fi |
| | | |
| | | rm $ERRORFILE $WAITLIST $WAITLIST_LCK |