+#!/bin/bash
+
+get_pkgbuild()
+{
+ source $1
+ echo "pkgname=$pkgname"
+ if [[ "$2" == "ros_depends" ]]; then
+ echo "depends=( ${ros_depends[@]%%[=<>]*} ${ros_makedepends[@]%%[=<>]*} )"
+ elif [[ "$2" == "depends" ]]; then
+ echo "depends=( ${depends[@]%%[=<>]*} )"
+ else
+ echo 'get_pkgbuild() must have either "rosdepends" or "depends" as second argument' >&2
+ fi
+}
+
+get_version()
+{
+ source $1
+ printf "%s-%s" "$pkgver" "$pkgrel"
+}
+
+get_makepkg_conf()
+{
+ source /etc/makepkg.conf
+ echo "pkgdest=${PKGDEST-.}"
+ echo "pkgext=${PKGEXT-.pkg.tar.xz}"
+}
+
+msg()
+{
+ local mesg=$1; shift
+ local ALL_OFF="$(tput sgr0)"
+ local BOLD="$(tput bold)"
+ local GREEN="${BOLD}$(tput setaf 2)"
+ printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+}
+
+get_all()
+{
+ echo $(find "$1" -name PKGBUILD)
+}
+
+get_from_list()
+{
+ if [[ $# -gt 0 ]]; then
+ local pkgs=( $@ )
+ dir=${pkgs[0]#ros-}; dir=${dir%%-*}
+ local pkgnames=${pkgs[@]#ros-$dir-}
+ pkgnames=${pkgnames//-/_}
+ for pkg in ${pkgnames[@]}; do
+ echo $dir/$pkg/PKGBUILD
+ done
+ fi
+}
+
+get_rosdepends()
+{
+ for pkgbuild in ${@}; do
+ source <(get_pkgbuild $pkgbuild "rosdepends")
+ for depend in ${depends[@]}; do
+ printf "%s %s\n" "$depend" "$pkgname"
+ done
+ done
+}
+
+get_depends()
+{
+ for pkgbuild in ${@}; do
+ source <(get_pkgbuild $pkgbuild "depends")
+ for depend in ${depends[@]}; do
+ printf "%s %s\n" "${depend}" "$pkgname"
+ done
+ done
+}
+
+usage()
+{
+ echo "usage: $(basename "$0") [option] rosdistro"
+ echo
+ echo " --force - force rebuilding all packages"
+ exit
+}
+
+# Argument parsing
+packageargs=()
+pkgargs=()
+while [[ $1 ]]; do
+ case "$1" in
+ '--force'|'-f') force='1' ;;
+ # '--ignore') ignorearg="$2" ; PACOPTS+=("--ignore" "$2") ; shift ;;
+ # '--') shift ; packageargs+=("$@") ; break ;;
+ -*) echo "$0: Option \`$1' is not valid." ; exit 5 ;;
+ groovy*) dir="groovy" ;;
+ hydro*) dir="hydro" ;;
+ indigo*) dir="indigo" ;;
+ *) pkgargs+=($1) ;;
+ esac
+ shift
+done
+
+if [[ $dir ]]; then
+ pkgbuilds=( $(get_all $dir) )
+elif [[ ${#pkgargs[@]} -gt 0 ]]; then
+ pkgbuilds=( $(get_from_list ${pkgargs[@]}) )
+ dir=${pkgbuilds[0]%%/*}
+else
+ usage
+fi
+
+makepkgopts+=("--asdeps" "--noconfirm")
+# [[ $force ]] && makepkgopts+=("--force") || makepkgopts+=("--needed")
+[[ $force ]] || makepkgopts+=("--needed")
+
+dependencies=( $(find "./dependencies" -name PKGBUILD) )
+sorted_deps=( $(tsort <(get_depends ${dependencies[@]}) ) )
+
+for dependency in ${sorted_deps[@]}; do
+ if pacman -Ssq "^$dependency$" > /dev/null; then
+ continue
+ fi
+ if ! pushd dependencies/"${dependency}" > /dev/null 2>&1 ; then
+ if [[ "$dependency" =~ "python3" ]]; then
+ dependency=${dependency/3/}
+ fi
+ if ! pushd dependencies/"${dependency}" > /dev/null 2>&1 ; then
+ echo "Could not enter dir 'dependencies/${dependency}'" >&2
+ continue
+ fi
+ fi
+ # makepkg -si "${makepkgopts[@]}"
+ retcode=$?
+ popd > /dev/null
+ [[ $retcode -ne 0 ]] && exit $retcode
+done
+
+exit
+
+
+sorted=( $(tsort <(get_rosdepends ${pkgbuilds[@]}) ) )
+source <(get_makepkg_conf)
+for pkgname in ${sorted[@]}; do
+ pkgdir=${pkgname#ros-$dir-}
+ pkgdir=${pkgdir//-/_}
+ pushd "$dir"/$pkgdir > /dev/null
+ ver=$(get_version ./PKGBUILD)
+ retcode=0
+ if [[ ! -e ignore ]]; then
+ pkgs=( $(ls --reverse *$pkgext 2> /dev/null) )
+ makepkg -si "${makepkgopts[@]}"
+ retcode=$?
+ # remove old pkgs
+ [[ -n "${pkgs[@]:1}" ]] && rm ${pkgs[@]:1}
+ fi
+ popd > /dev/null
+ [[ $retcode -ne 0 ]] && exit $retcode
+done