summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtreepkg125
1 files changed, 125 insertions, 0 deletions
diff --git a/treepkg b/treepkg
new file mode 100755
index 0000000..4ad02fc
--- /dev/null
+++ b/treepkg
@@ -0,0 +1,125 @@
+#!/bin/bash
+#set -x
+source /etc/libretools.conf
+source $(dirname $0)/libremessages
+source $XDG_CONFIG_HOME/libretools/libretools.conf >/dev/null 2>&1|| true
+
+# End inmediately but print a useful message
+trap_exit() {
+ error "($(basename $0)) $@"
+ exit 1
+}
+
+# Trap signals from makepkg
+set -E
+trap 'trap_exit "TERM signal caught. Exiting..."' TERM HUP QUIT
+trap 'trap_exit "Aborted by user! Exiting..."' INT
+trap 'trap_exit "An unknown error has occurred. Exiting..."' ERR
+
+# return : full version spec, including epoch (if necessary), pkgver, pkgrel
+# usage : get_fullver( ${epoch:-0}, $pkgver, $pkgrel )
+get_fullver() {
+ if [ $1 -eq 0 ]; then
+# zero epoch case, don't include it in version
+ echo $2-$3
+ else
+ echo $1:$2-$3
+ fi
+
+}
+
+# Add line to build order cache in CSV format
+# $1 status
+# $2 pkgname
+add_order() {
+ echo "${1};${DEPTH};${2:-${pkgbase}};${fullver};${PWD}" >> "${BUILDORDER}"
+ ${VERBOSE} && msg2 "%${DEPTH}s${2:-${pkgbase}} [${1}]" || true
+}
+
+# Finds a PKGBUILD on toru's path cache
+# Look in all caches but pick the first one
+# TODO move to a toru flag (-p?)
+where_is() {
+ grep -m1 "^${1}:" "${TORUPATH}/paths" 2>/dev/null| \
+ cut -d: -f2 2>/dev/null
+}
+
+if [ ! -f PKGBUILD ]; then
+ error "Missing PKGBUILD"
+ exit 1
+fi
+
+if ! source PKGBUILD ; then
+ error "Can't source PKGBUILD"
+ exit 1
+fi
+
+# Save resources
+unset pkgdesc arch license groups backup install md5sums sha1sums \
+ sha256sums source options >/dev/null 2>&1
+
+unset build package >/dev/null 2>&1
+
+for _pkg in ${pkgname[@]}; do
+ unset package_${_pkg} >/dev/null 2>&1 || true
+done
+##
+
+# Get useful values
+pkgbase="${pkgbase:-${pkgname[0]}}"
+fullver=$(get_fullver ${epoch:-0} ${pkgver} ${pkgrel})
+
+# Get or set the build order cache (canonical)
+BUILDORDER="$(readlink -f "${1:-$(mktemp /tmp/${pkgbase}.buildorder.XXXX)}")"
+DEPTH=${2:-0}
+NEXTDEPTH=$((${DEPTH} + 1))
+VERBOSE=true
+
+# ensure it exists
+touch "${BUILDORDER}"
+
+# If this package is already built quit silently
+if is_built "${pkgbase}>=${fullver}"; then
+ add_order "ignore"
+ exit 0
+fi
+
+# Ignore if already in build order
+egrep -q ";${pkgbase};" "${BUILDORDER}" && exit 0
+
+# Add pkgbase to build order
+add_order "build"
+
+# Cleanup dep versioning
+deps=($(echo "${depends[@]} ${makedepends[@]}" | \
+ sed "s/[=<>]\+[^ ]\+//g" | \
+ tr ' ' "\n" | \
+ sort -u))
+
+# NOTE: getting depends from package() is a PITA
+for _dep in ${deps[@]}; do
+# Ignore if already in build order
+ egrep -q ";${_dep};" "${BUILDORDER}" && continue
+
+ depdir="$(where_is ${_dep})"
+
+ if [ -z "${depdir}" -o ! -d "${depdir}" ]; then
+# We specify the pkgname because we can't source the dep PKGBUILD
+ add_order "missing" "${_dep}"
+ continue
+ fi
+
+ pushd "${depdir}" >/dev/null
+
+# Run itself over dependencies
+ $0 "${BUILDORDER}" ${NEXTDEPTH}
+
+done
+
+# Only print build order at the end
+if [ ${DEPTH} -eq 0 ]; then
+ ${VERBOSE} && msg "Build tree stored in ${BUILDORDER}" || true
+ ${VERBOSE} || echo "${BUILDORDER}" || true
+fi
+
+exit $?