From 73f49edd89a1bb4ed023b81bfcf113d4a6956887 Mon Sep 17 00:00:00 2001 From: Nicolas Reynolds Date: Tue, 21 Jun 2011 01:52:39 -0300 Subject: Toru now can compare a given ABS repo against the repo.db to show required updates. It doesn't store state yet, so it starts from top on every run. Example usage: toru -u $ABSROOT/core To build *all* updates: sudo pacman -Sy pushd $ABSROOT/core >/dev/null for pkg in $(toru -uq $PWD); do pushd $pkg >/dev/null fullpkg popd >/dev/null done --- toru | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 110 insertions(+), 28 deletions(-) (limited to 'toru') diff --git a/toru b/toru index 1ae336b..e411b3b 100755 --- a/toru +++ b/toru @@ -4,30 +4,23 @@ ## TODO # * Add license text -# * Add everything -# * Compare pacman sync against ABS (db-functions could be useful) # * Create symlinks from pkgbase to pkgname[@] for easy package finding +# * Use lastsync to store processed packages ## GOALS # * Have a searchable database of PKGBUILD metadata # * Have an interface for source-only builds -# * Possibility to hook up ABS dirs besides ABSROOT -# * Tell updates and non available binary packages +# * Possibility to hook up ABS dirs besides ABSROOT (low priority) +# * Tell updates and non available binary packages (working on this) source /etc/abs.conf source /etc/libretools.conf -[ ! -w / ] && { - error "This script must be run as root." - exit 1 -} +#[ ! -w / ] && { +# error "This script must be run as root." +# exit 1 +#} -# This is the syncfile, stores the last date as content and mtime -lastsyncfile=${ABSROOT}/toru.lastsync - -TMPDIR=$(mktemp -d) - -[[ -z ${TMPDIR} ]] && exit 1 # Stores the lastsync date lastsync() { @@ -40,26 +33,73 @@ lastsync() { touch ${lastsyncfile} } -# Adds a field=value on the package description -addfield() { +## +# usage : get_full_version( $epoch, $pkgver, $pkgrel ) +# return : full version spec, including epoch (if necessary), pkgver, pkgrel +## +get_full_version() { + if [[ $1 -eq 0 ]]; then + # zero epoch case, don't include it in version + echo $2-$3 + else + echo $1:$2-$3 + fi +} + +# Outputs an ordered package-fullpkgver array +print_package_array() { + echo "$@" | tr " " "\n" | sort -V -u +} + + +# Gets repo.db contents +# $1 repo +get_db_contents() { + [ ! -r /var/lib/pacman/sync/$1.db ] && return 0 + + bsdtar -tf /var/lib/pacman/sync/$1.db | \ + cut -d'/' -f1 | \ + sort -V -u +} + + +extract_pkgname() { + echo "$@" | tr " " "\n" | sed "s/^\(.\+\)-[^-]\+-[^-]\+$/\1/" +} + +extract_fullpkgver() { + echo "$@" | tr " " "\n" | sed "s/^.\+-\([^-]\+-[^-]\+\)$/\1/" } + # Updates the database by finding all PKGBUILDS +# Workflow: +# * Find all PKGBUILDs on the ABS repo specified +# * Get all packages already on package repos +# * Compare them # Args: update() { +# The PKGBUILDs found + local pkgbuilds=() +# The list of pkgname-fullpkgver + local packages_to_sync=() + local packages_in_sync=() + local needed_updates=() + local old_versions=() + # Find all the PKGBUILDs newer than the last update # Update newer, otherwise everything - if [ ! -e ${lastsyncfile} -o "${force}" = "y" ]; then - msg "Forcing upgrade" + if [ $force ] || [ ! -e ${lastsyncfile} ]; then + $quiet || msg "Forcing upgrade" pkgbuilds=($(find ${@} -maxdepth 2 -type f -name 'PKGBUILD')) else pkgbuilds=($(find ${@} -maxdepth 2 -type f -name 'PKGBUILD' -newer ${lastsyncfile})) fi # Inform how many PKGBUILDS were found and quit immediately if none - msg "Found $((${#pkgbuilds[*]}-1)) packages to update" + $quiet || msg "Found $((${#pkgbuilds[*]}-1)) packages to update" [ ${#pkgbuilds[*]} -eq 1 ] && { - msg2 "There's nothing to be done. Phew!" + $quiet || msg2 "There's nothing to be done. Phew!" exit 0 } @@ -71,28 +111,70 @@ update() { _pkgbase=$(basename "${_pkgpath}") _pkgrepo=$(basename $(dirname "${_pkgpath}")) - msg2 "Updating ${_pkgrepo}/${_pkgbase}" - source ${_pkgbuild} for _pkg in ${pkgname[@]}; do +# Fill the list of packages to find + packages_to_sync+=($_pkg-$(get_full_version ${epoch:-0} $pkgver $pkgrel)) done - unset pkgbase pkgname pkgver pkgrel source + unset pkgbase pkgname pkgver pkgrel source epoch + done + +# Get repo database contents + packages_in_sync=($(get_db_contents ${_pkgrepo})) + print_package_array "${packages_to_sync[@]}" > ${TMPDIR}/packages_to_sync + print_package_array "${packages_in_sync[@]}" > ${TMPDIR}/packages_in_sync + +# We've orderer the files! + needed_updates=($(comm --nocheck-order -32 ${TMPDIR}/packages_to_sync ${TMPDIR}/packages_in_sync)) + old_versions=($(comm --nocheck-order -31 ${TMPDIR}/packages_to_sync ${TMPDIR}/packages_in_sync)) + + $quiet || msg "This packages are available to update" + for _update in ${needed_updates[@]}; do + pkg=$(extract_pkgname $_update) + + $quiet && echo $pkg + $quiet || { + ver=$(extract_fullpkgver $_update) + oldver=$(extract_fullpkgver $(grep -w $pkg ${TMPDIR}/packages_in_sync)) + + msg2 "$pkg $oldver => $ver" + } done - lastsync +# lastsync } ## MAIN -command=${1:-update}; shift -force=${1:-n}; shift -dirs=${@} +commands=() +repos=() +quiet=false +force=false +while getopts 'hqfu' arg; do + case $arg in + h) usage; exit 0 ;; + q) quiet=true ;; + f) force=true ;; + u) commands+=(update);; + esac + + shift $((OPTIND-1)) +done + +# This is the syncfile, stores the last date as content and mtime +#lastsyncfile=${ABSROOT}/toru.lastsync + +TMPDIR=$(mktemp -d) + +[[ -z ${TMPDIR} ]] && exit 1 + +${commands[0]} ${@} -${command} ${dirs[@]} +rm -rf ${TMPDIR} exit $? -- cgit v1.2.2