summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtoru138
1 files changed, 110 insertions, 28 deletions
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 $?