From 61b19919818a0b87aef5544ce2853f2ef2b76e58 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Sun, 22 Jan 2012 14:48:51 -0300 Subject: Fullpkg redone :) --- treepkg | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100755 treepkg (limited to 'treepkg') 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 $? -- cgit v1.2.3-2-g168b From 787ef61e1997deeda97e055f7f0fe27a1b7ab2b5 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Sun, 22 Jan 2012 22:53:26 -0300 Subject: Create a work dir and build in order --- treepkg | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) (limited to 'treepkg') diff --git a/treepkg b/treepkg index 4ad02fc..622b979 100755 --- a/treepkg +++ b/treepkg @@ -69,11 +69,15 @@ done 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)}")" +# Get or set the work dir +BUILDDIR="${1:-$(mktemp -d /tmp/${pkgbase}-treepkg-XXXx)}" +BUILDORDER="${BUILDDIR}/BUILDORDER" DEPTH=${2:-0} NEXTDEPTH=$((${DEPTH} + 1)) -VERBOSE=true +# This can be set as env vars (ie: $ V=false B=false treepkg) +# TODO Turn into flags? +VERBOSE=${V:-true} +BUILD=${B:-true} # ensure it exists touch "${BUILDORDER}" @@ -90,6 +94,10 @@ egrep -q ";${pkgbase};" "${BUILDORDER}" && exit 0 # Add pkgbase to build order add_order "build" +# Copy the directory to the build dir +# TODO run makepkg --source to avoid moving garbage around? +cp -r "${PWD}" "${BUILDDIR}/$(printf "%03d" ${DEPTH})_${pkgbase}" + # Cleanup dep versioning deps=($(echo "${depends[@]} ${makedepends[@]}" | \ sed "s/[=<>]\+[^ ]\+//g" | \ @@ -99,12 +107,18 @@ deps=($(echo "${depends[@]} ${makedepends[@]}" | \ # NOTE: getting depends from package() is a PITA for _dep in ${deps[@]}; do # Ignore if already in build order +# TODO move deps deeper in the tree if +# pkgbase - dep1 +# \ dep2 - dep1 +# dep1 should be depth + 1 egrep -q ";${_dep};" "${BUILDORDER}" && continue +# Ask toru where's a PKGBUILD depdir="$(where_is ${_dep})" if [ -z "${depdir}" -o ! -d "${depdir}" ]; then # We specify the pkgname because we can't source the dep PKGBUILD +# Normally 'any' packages are missing from our work ABS add_order "missing" "${_dep}" continue fi @@ -112,14 +126,37 @@ for _dep in ${deps[@]}; do pushd "${depdir}" >/dev/null # Run itself over dependencies - $0 "${BUILDORDER}" ${NEXTDEPTH} + $0 "${BUILDDIR}" ${NEXTDEPTH} done -# Only print build order at the end +# Only build at the end if [ ${DEPTH} -eq 0 ]; then - ${VERBOSE} && msg "Build tree stored in ${BUILDORDER}" || true - ${VERBOSE} || echo "${BUILDORDER}" || true + +# TODO fill this var with a flag + if ${BUILD}; then + ${VERBOSE} && msg "Build tree stored in ${BUILDORDER}" || true + +# Build everything sorting the build dir +# The reverse order ensures we start by the deepest packages + ${VERBOSE} && msg "Starting build" || true + for _pkg in $(ls -r "${BUILDDIR}"); do +# Ignore if there's no PKGBUILD + if [ ! -f "${BUILDDIR}/${_pkg}/PKGBUILD" ]; then continue; fi + + ${VERBOSE} && msg "Building ${_pkg/_/ }" || true + +# Run build command + pushd "${BUILDDIR}/${_pkg}" >/dev/null + ${FULLBUILDCMD} + popd >/dev/null + done + + else +# Just print the working dir + ${VERBOSE} || echo "${BUILDORDER}" || true + fi + fi exit $? -- cgit v1.2.3-2-g168b From 0f72189f9a62af346592ce54a55810f973d8d7ed Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Sun, 22 Jan 2012 23:32:00 -0300 Subject: Quicker is_built, only one call to pacman time shows this version is 1s long against 5s from before --- treepkg | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'treepkg') diff --git a/treepkg b/treepkg index 622b979..ccabe20 100755 --- a/treepkg +++ b/treepkg @@ -83,7 +83,7 @@ BUILD=${B:-true} touch "${BUILDORDER}" # If this package is already built quit silently -if is_built "${pkgbase}>=${fullver}"; then +if is_built "${pkgbase}" "${fullver}"; then add_order "ignore" exit 0 fi @@ -132,14 +132,13 @@ done # Only build at the end if [ ${DEPTH} -eq 0 ]; then + ${VERBOSE} && msg "Starting build" || true -# TODO fill this var with a flag if ${BUILD}; then ${VERBOSE} && msg "Build tree stored in ${BUILDORDER}" || true # Build everything sorting the build dir # The reverse order ensures we start by the deepest packages - ${VERBOSE} && msg "Starting build" || true for _pkg in $(ls -r "${BUILDDIR}"); do # Ignore if there's no PKGBUILD if [ ! -f "${BUILDDIR}/${_pkg}/PKGBUILD" ]; then continue; fi -- cgit v1.2.3-2-g168b From 7d6e9b08d749983263ed3ee890f73d13e73740c8 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Sun, 5 Feb 2012 02:45:18 -0300 Subject: Make treepkg run HOOKLOCALRELEASE and mipsrelease update the databases treepkg should stay away of updating databases, since it can be used inside or outside the chroot. (updating dbs from outside is unnecessary) --- treepkg | 1 + 1 file changed, 1 insertion(+) (limited to 'treepkg') diff --git a/treepkg b/treepkg index ccabe20..376af91 100755 --- a/treepkg +++ b/treepkg @@ -148,6 +148,7 @@ if [ ${DEPTH} -eq 0 ]; then # Run build command pushd "${BUILDDIR}/${_pkg}" >/dev/null ${FULLBUILDCMD} + ${HOOKLOCALRELEASE} popd >/dev/null done -- cgit v1.2.3-2-g168b From 94b94c9ea476e4e791219bd2c017741a3274bbc5 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Mon, 6 Feb 2012 02:26:50 -0300 Subject: Treepkg guess repo and put it on BUILDORDER. Also remove libremessages since libretools.conf does this for us. --- treepkg | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'treepkg') diff --git a/treepkg b/treepkg index 376af91..167ccbd 100755 --- a/treepkg +++ b/treepkg @@ -1,9 +1,12 @@ #!/bin/bash #set -x source /etc/libretools.conf -source $(dirname $0)/libremessages source $XDG_CONFIG_HOME/libretools/libretools.conf >/dev/null 2>&1|| true +# Get system variables +source /etc/makepkg.conf +source $HOME/makepkg.conf >/dev/null 2>&1|| true + # End inmediately but print a useful message trap_exit() { error "($(basename $0)) $@" @@ -32,7 +35,7 @@ get_fullver() { # $1 status # $2 pkgname add_order() { - echo "${1};${DEPTH};${2:-${pkgbase}};${fullver};${PWD}" >> "${BUILDORDER}" + echo "${1};${DEPTH};${2:-${pkgbase}};${fullver};${PWD};$(guess_repo "$PWD")" >> "${BUILDORDER}" ${VERBOSE} && msg2 "%${DEPTH}s${2:-${pkgbase}} [${1}]" || true } @@ -44,8 +47,14 @@ where_is() { cut -d: -f2 2>/dev/null } +# Guess the repo from the pkgbase path +# $1 path, pwd or where_is +guess_repo() { + basename "$(dirname "${1}")" +} + if [ ! -f PKGBUILD ]; then - error "Missing PKGBUILD" + error "Missing PKGBUILD ($PWD)" exit 1 fi @@ -148,7 +157,8 @@ if [ ${DEPTH} -eq 0 ]; then # Run build command pushd "${BUILDDIR}/${_pkg}" >/dev/null ${FULLBUILDCMD} - ${HOOKLOCALRELEASE} +# Run local release hook with $1 = $repo + ${HOOKLOCALRELEASE} $(egrep ";${_pkg};" "${BUILDORDER}" | cut -d';' -f6) popd >/dev/null done -- cgit v1.2.3-2-g168b From ebc66c503aad4df99f8660f2e4557c23cdc24fd3 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Mon, 6 Feb 2012 03:00:34 -0300 Subject: _pkg contained the depth also --- treepkg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'treepkg') diff --git a/treepkg b/treepkg index 167ccbd..bd95253 100755 --- a/treepkg +++ b/treepkg @@ -158,7 +158,7 @@ if [ ${DEPTH} -eq 0 ]; then pushd "${BUILDDIR}/${_pkg}" >/dev/null ${FULLBUILDCMD} # Run local release hook with $1 = $repo - ${HOOKLOCALRELEASE} $(egrep ";${_pkg};" "${BUILDORDER}" | cut -d';' -f6) + ${HOOKLOCALRELEASE} $(egrep ";${_pkg#*_};" "${BUILDORDER}" | cut -d';' -f6) popd >/dev/null done -- cgit v1.2.3-2-g168b From 6fbba8f74c28d58731c9611839e31955708d4b65 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Wed, 8 Feb 2012 14:09:53 -0300 Subject: Perform cleanups + "bury" packages if needed --- treepkg | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'treepkg') diff --git a/treepkg b/treepkg index bd95253..b3e4fe0 100755 --- a/treepkg +++ b/treepkg @@ -7,9 +7,9 @@ source $XDG_CONFIG_HOME/libretools/libretools.conf >/dev/null 2>&1|| true source /etc/makepkg.conf source $HOME/makepkg.conf >/dev/null 2>&1|| true -# End inmediately but print a useful message +# End inmediately but print an useful message trap_exit() { - error "($(basename $0)) $@" + error "($(basename $0)) $@ (leftovers on ${BUILDDIR})" exit 1 } @@ -32,6 +32,8 @@ get_fullver() { } # Add line to build order cache in CSV format +# *must* be run from the PKGBUILD path +# status;depth;pkgbase;[epoch:]pkgver-pkgrel;path;repo # $1 status # $2 pkgname add_order() { @@ -39,6 +41,30 @@ add_order() { ${VERBOSE} && msg2 "%${DEPTH}s${2:-${pkgbase}} [${1}]" || true } +# Bury a package deeper in the tree +# $1 pkgbase +# $2 nextdepth +bury() { +# Bury only if we are going to build the dep +# Get it's current depth and dir name + local current_depth=$(egrep "build;[0-9]\+;${1};" "${BUILDORDER}" | cut -d ';' -f 2) + local current_name="$(printf "%03d" ${current_depth})_${1}" + +# If there's a depth or the package is not the root of the build tree (which +# can lead to funny chicken-and-egg problems), update the depth to the current +# package next-depth and rename the dir too + if [ -z "${current_depth}" ]; then return; fi + if [ -z "${current_name}" ]; then return; fi + if [ ${current_depth} -eq 0 ]; then return; fi + + ${VERBOSE} && msg "Burying ${1} from ${current_depth} to ${2}" + + { + sed -i "s|^\(build;\)\([0-9]\+\)\(;${1};.*\)$|\1${2}\3|" "${BUILDORDER}" && \ + mv "${BUILDDIR}/${current_name}" "${BUILDDIR}/$(printf "%03d" ${2})_${1}" + } || return 1 +} + # Finds a PKGBUILD on toru's path cache # Look in all caches but pick the first one # TODO move to a toru flag (-p?) @@ -87,6 +113,7 @@ NEXTDEPTH=$((${DEPTH} + 1)) # TODO Turn into flags? VERBOSE=${V:-true} BUILD=${B:-true} +CLEANUP=${C:-true} # ensure it exists touch "${BUILDORDER}" @@ -120,7 +147,9 @@ for _dep in ${deps[@]}; do # pkgbase - dep1 # \ dep2 - dep1 # dep1 should be depth + 1 - egrep -q ";${_dep};" "${BUILDORDER}" && continue +# probably sed -i buildorder and increase dep's dep depth :D +# remember to change dir name from xxx_pkgbase to xxx+1_pkgbase + egrep -q ";${_dep};" "${BUILDORDER}" && bury "${_dep}" ${NEXTDEPTH} # Ask toru where's a PKGBUILD depdir="$(where_is ${_dep})" @@ -167,6 +196,11 @@ if [ ${DEPTH} -eq 0 ]; then ${VERBOSE} || echo "${BUILDORDER}" || true fi +if (( CLEANUP )); then + msg2 "Removing ${BUILDDIR}" + rm -rf "${BUILDDIR}" +fi + fi exit $? -- cgit v1.2.3-2-g168b From 875ec16b3d25c2b4d9dc5c940702f5ecde76cf7f Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Tue, 14 Feb 2012 11:41:40 -0300 Subject: Update the system before building --- treepkg | 2 ++ 1 file changed, 2 insertions(+) (limited to 'treepkg') diff --git a/treepkg b/treepkg index b3e4fe0..a49301e 100755 --- a/treepkg +++ b/treepkg @@ -185,6 +185,8 @@ if [ ${DEPTH} -eq 0 ]; then # Run build command pushd "${BUILDDIR}/${_pkg}" >/dev/null + sudo pacman -Syu + ${FULLBUILDCMD} # Run local release hook with $1 = $repo ${HOOKLOCALRELEASE} $(egrep ";${_pkg#*_};" "${BUILDORDER}" | cut -d';' -f6) -- cgit v1.2.3-2-g168b From ee706c5c36fd8993905a14aa2afeb5951dac6ec9 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Fri, 24 Feb 2012 18:51:14 -0300 Subject: Start from a build tree using `N=true treepkg /path/to/build/dir` Needs flags :) --- treepkg | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-) (limited to 'treepkg') diff --git a/treepkg b/treepkg index a49301e..e742858 100755 --- a/treepkg +++ b/treepkg @@ -114,34 +114,37 @@ NEXTDEPTH=$((${DEPTH} + 1)) VERBOSE=${V:-true} BUILD=${B:-true} CLEANUP=${C:-true} +# Skip BUILDORDER creation and build anything on BUILDDIR +BUILDNOW=${N:-false} +if ! ${BUILDNOW}; then # ensure it exists -touch "${BUILDORDER}" + touch "${BUILDORDER}" # If this package is already built quit silently -if is_built "${pkgbase}" "${fullver}"; then - add_order "ignore" - exit 0 -fi + if is_built "${pkgbase}" "${fullver}"; then + add_order "ignore" + exit 0 + fi # Ignore if already in build order -egrep -q ";${pkgbase};" "${BUILDORDER}" && exit 0 + egrep -q ";${pkgbase};" "${BUILDORDER}" && exit 0 # Add pkgbase to build order -add_order "build" + add_order "build" # Copy the directory to the build dir # TODO run makepkg --source to avoid moving garbage around? -cp -r "${PWD}" "${BUILDDIR}/$(printf "%03d" ${DEPTH})_${pkgbase}" + cp -r "${PWD}" "${BUILDDIR}/$(printf "%03d" ${DEPTH})_${pkgbase}" # Cleanup dep versioning -deps=($(echo "${depends[@]} ${makedepends[@]}" | \ - sed "s/[=<>]\+[^ ]\+//g" | \ - tr ' ' "\n" | \ - sort -u)) + deps=($(echo "${depends[@]} ${makedepends[@]}" | \ + sed "s/[=<>]\+[^ ]\+//g" | \ + tr ' ' "\n" | \ + sort -u)) # NOTE: getting depends from package() is a PITA -for _dep in ${deps[@]}; do + for _dep in ${deps[@]}; do # Ignore if already in build order # TODO move deps deeper in the tree if # pkgbase - dep1 @@ -149,24 +152,26 @@ for _dep in ${deps[@]}; do # dep1 should be depth + 1 # probably sed -i buildorder and increase dep's dep depth :D # remember to change dir name from xxx_pkgbase to xxx+1_pkgbase - egrep -q ";${_dep};" "${BUILDORDER}" && bury "${_dep}" ${NEXTDEPTH} + egrep -q ";${_dep};" "${BUILDORDER}" && bury "${_dep}" ${NEXTDEPTH} # Ask toru where's a PKGBUILD - depdir="$(where_is ${_dep})" + depdir="$(where_is ${_dep})" - if [ -z "${depdir}" -o ! -d "${depdir}" ]; then + if [ -z "${depdir}" -o ! -d "${depdir}" ]; then # We specify the pkgname because we can't source the dep PKGBUILD # Normally 'any' packages are missing from our work ABS - add_order "missing" "${_dep}" - continue - fi + add_order "missing" "${_dep}" + continue + fi - pushd "${depdir}" >/dev/null + pushd "${depdir}" >/dev/null # Run itself over dependencies - $0 "${BUILDDIR}" ${NEXTDEPTH} + $0 "${BUILDDIR}" ${NEXTDEPTH} -done + done +# End BUILD now +fi # Only build at the end if [ ${DEPTH} -eq 0 ]; then @@ -198,7 +203,7 @@ if [ ${DEPTH} -eq 0 ]; then ${VERBOSE} || echo "${BUILDORDER}" || true fi -if (( CLEANUP )); then +if ${CLEANUP} ; then msg2 "Removing ${BUILDDIR}" rm -rf "${BUILDDIR}" fi -- cgit v1.2.3-2-g168b From b53d6c027ad0a90c676419d2246fa76a7682221a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Reynolds?= Date: Wed, 4 Apr 2012 20:42:38 -0300 Subject: Pass the build dir as first argument to retake a build --- treepkg | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'treepkg') diff --git a/treepkg b/treepkg index e742858..7d210cf 100755 --- a/treepkg +++ b/treepkg @@ -117,6 +117,10 @@ CLEANUP=${C:-true} # Skip BUILDORDER creation and build anything on BUILDDIR BUILDNOW=${N:-false} +if [ ! -z "${1}" -a ${DEPTH} -eq 0 ]; then + BUILDNOW=true +fi + if ! ${BUILDNOW}; then # ensure it exists touch "${BUILDORDER}" @@ -190,7 +194,7 @@ if [ ${DEPTH} -eq 0 ]; then # Run build command pushd "${BUILDDIR}/${_pkg}" >/dev/null - sudo pacman -Syu + sudo pacman -Syu --noconfirm ${FULLBUILDCMD} # Run local release hook with $1 = $repo -- cgit v1.2.3-2-g168b