#!/bin/oksh BASE="${0%/*}/.." . "${BASE}/conf/default.conf" UPATE_UPSTREAM=0 UPDATE_AUR=0 STATS=0 OPTIONS=`getopt -n update -o huas -l help,upstream,aur,stats -- "$@"` if test $? != 0; then echo "ERROR: internal error which using getopt.." >&2; exit 1 fi eval set -- "$OPTIONS" while true; do case "$1" in -h|--help) echo "update [options]" echo "" echo "-u --upstream update from update git state and package repo" echo "-a --aur update from the AUR" echo "-s --stats compute and print statistics" exit 0 ;; -u|--uptream) UPDATE_UPSTREAM=1 shift ;; -a|--aur) UPDATE_AUR=1 shift ;; -s|--status) STATS=1 shift ;; --) shift break ;; *) echo "ERROR: Internal error in getopt" >&2 exit 1 esac done shift `expr $OPTIND - 1` if test ! -d "${state_dir}"; then echo "no upstream git state repo of packages.. exiting.." exit 1 fi if test ! -d "${packages_dir}"; then echo "no directory for uptream package descriptions.. exiting.." exit 1 fi if test ! -d "${aur_state_dir}"; then echo "no AUR state directory exists of .. exiting.." exit 1 fi if test "${UPDATE_UPSTREAM}" = 1; then echo "Updating main state git repo.." git -C "${state_dir}" pull if test "${STATS}" = 1; then echo "Checking statistics.." find "${state_dir}"/{core,extra}-{any,x86_64} -type f > /tmp/update_packages.$$ nof_packages=`cat /tmp/update_packages.$$ | wc -l` nof_checked_out_packages=`find "${packages_dir}" -type f -name PKGBUILD | wc -l` echo "${nof_packages} packages in state repo" echo "${nof_checked_out_packages} packages are checked out" sleep 10 fi for pkgfile in `cat /tmp/update_packages.$$`; do repo=`echo "${pkgfile}" | rev | cut -f 2 -d / | rev` OLDIFS="$IFS" IFS=" " while read pkgname pkgver tag revision; do echo "${repo} ${pkgname}" if test ! -d "${packages_dir}/${repo}/${pkgname}"; then cd "${packages_dir}/${repo}" || exit 1 pkgctl repo clone --protocol=https "${pkgname}" sleep 10 else true # TODO: find a way to find out whether the reference revision is in out # current state repo and update only when we miss it. We can still # do a full update when we need it, but here it just creates a lot # of load.. # git -C "${packages_dir}/${repo}/${pkgname}" pull fi done < $pkgfile IFS="$OLDIFS" done fi if test "${UPDATE_AUR}" = 1; then echo "Updating AUR state.." rm -f "${aur_state_dir}/packages" wget --quiet -O "${aur_state_dir}/packages.gz" https://aur.archlinux.org/packages.gz gunzip "${aur_state_dir}/packages.gz" if test "${STATS}" = 1; then echo "Checking statistics.." nof_aur_packages=`wc -l ${aur_state_dir}/packages | cut -f 1 -d ' '` echo "${nof_aur_packages} packages in AUR" sleep 10 fi fi # TODO: update all single package directories # TODO: update all AUR package directories