#!/bin/oksh BASE="${0%/*}/.." . "${BASE}/conf/default.conf" UPATE_UPSTREAM=0 UPDATE_AUR=0 STATS=0 VERBOSE=0 OPTIONS=`getopt -n update -o huasv -l help,upstream,aur,stats,verbose -- "$@"` 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" echo "-v --verbose be verbose" exit 0 ;; -u|--uptream) UPDATE_UPSTREAM=1 shift ;; -a|--aur) UPDATE_AUR=1 shift ;; -s|--status) STATS=1 shift ;; -v|--verbose) VERBOSE=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 find "${state_dir}"/{core,extra}-{any,x86_64} -type f | sort > /tmp/update_packages.$$ nof_checked_out_packages=0 nof_updated_packages=0 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 if test "${VERBOSE}" = 1; then echo -n "${repo} ${pkgname}" fi if test ! -d "${packages_dir}/${repo}/${pkgname}"; then if test "${VERBOSE}" = 1; then echo ".. cloning .." fi cd "${packages_dir}/${repo}" || exit 1 pkgctl repo clone --protocol=https "${pkgname}" nof_updated_packages=`expr ${nof_updated_packages} + 1` sleep 10 else # get all revisions from the package repo, check if # we find the state sha in there, if not, do an # update of the repo. Doing a full git pull on # every update is not acceptable as it creates too # much load cd "${packages_dir}/${repo}/${pkgname}" || exit 1 git show-ref --tags > /tmp/update_package_revisions.$$ grep -F "${revision}" "/tmp/update_package_revisions.$$" 2>&1 >/tmp/update_package_revision_found.$$ if test $? = 0; then if test "${VERBOSE}"; then tag=`cat /tmp/update_package_revision_found.$$ | cut -d ' ' -f 2` echo ".. ${revision} (${tag}) exists in package history .." fi else if test "${VERBOSE}"; then echo ".. updating .." fi git -C "${packages_dir}/${repo}/${pkgname}" pull nof_checked_out_packages=`expr ${nof_checked_out_packages} + 1` sleep 10 fi rm -f /tmp/update_package_revisions.$$ /tmp/update_package_revision_found.$$ fi done < $pkgfile IFS="$OLDIFS" done if test "${STATS}" = 1; then echo "Checking statistics.." 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" echo "${nof_checked_out_packages} packages have been checked out" echo "${nof_updated_packages} packages have been updated" fi fi rm -f /tmp/update_packages.$$ 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