#!/bin/bash
-[[ ${FLOCKER} != $0 ]] && exec env FLOCKER=$0 flock -en $0 -c "$0 $*" || :
-
-logdir="/var/log"
-sync_log="${logdir}/rsync.log"
-up_log="${logdir}/emerge-updates.log"
-
+GS_SYNC=true
GS_RSYNC=false
GS_EUPDATEDB=true
GS_FETCH=false
GS_UPWORLD=true
GS_LAYMAN=true
+GS_DEBUG=false
+GS_USER="portage"
conf="/etc/gentoo-sync.conf"
[[ -e ${conf} ]] && . "${conf}"
+logdir="/var/log"
+sync_log="${logdir}/rsync.log"
+up_log="${logdir}/emerge-updates.log"
+
+bootstrap() {
+ local prog=$(realpath "$0")
+ if [[ "${FLOCKER}" != "${prog}" ]] ; then
+ exec env -uUNSHARE FLOCKER="${prog}" flock -en "${prog}" "${prog}" "$@"
+ fi
+
+ if [[ -z ${UNSHARE} ]] ; then
+ if [[ $(id -u) -ne 0 ]] ; then
+ exec sudo env -uUNSHARE FLOCKER="${FLOCKER}" HOME="$HOME" "${prog}" "$@"
+ fi
+
+ touch "${sync_log}" "${up_log}"
+ chown "${GS_USER}" "${sync_log}" "${up_log}"
+
+ mount_args=
+ if type -P unshare >&/dev/null ; then
+ test_arg() { unshare "$@" -- true >&/dev/null && uargs+=( "$@" ) || :; }
+ uargs=( -m )
+ test_arg -u
+ test_arg -i
+ test_arg -p -f --mount-proc
+ test_arg --propagation=private
+ exec unshare "${uargs[@]}" -- \
+ sudo -u "${GS_USER}" UNSHARE="true" FLOCKER="${FLOCKER}" \
+ "${prog}" "$@"
+ fi
+ else
+ mount_args='-n'
+ fi
+ unset UNSHARE
+}
+bootstrap "$@"
+
+usage() {
+ cat <<-EOF
+ Usage: ${0##*/} [options]
+
+ Options:
+ -h, --help
+ -a, --all, -na, --noall
+ -s, --sync, -ns, --nosync ${GS_SYNC}
+ -r, --rsync, -nr, --norsync ${GS_RSYNC}
+ -d, --database, -nd, --nodatabase ${GS_EUPDATEDB}
+ -f, --fetch, -nf, --nofetch ${GS_FETCH}
+ -w, --world, -nw, --noworld ${GS_UPWORLD}
+ -l, --layman, -nl, --nolayman ${GS_LAYMAN}
+ -x, --debug, -nx, --nodebug ${GS_DEBUG}
+ EOF
+ exit 0
+}
+
+s() {
+ local x val=$1
+ shift
+ for x ; do
+ eval GS_${x}=${val};
+ done
+}
+for x ; do
+ case ${x} in
+ -h|--help) usage;;
+ -a|--all) s true SYNC RSYNC EUPDATEDB FETCH UPWORLD LAYMAN DEBUG;;
+ -na|--noall) s false SYNC RSYNC EUPDATEDB FETCH UPWORLD LAYMAN DEBUG;;
+ -s|--sync) s true SYNC;;
+ -ns|--nosync) s false SYNC;;
+ -r|--rsync) s true RSYNC;;
+ -nr|--norsync) s false RSYNC;;
+ -d|--database) s true EUPDATEDB;;
+ -nd|--nodatabase) s false EUPDATEDB;;
+ -f|--fetch) s true FETCH;;
+ -nf|--nofetch) s false FETCH;;
+ -w|--world) s true UPWORLD;;
+ -nw|--noworld) s false UPWORLD;;
+ -l|--layman) s true LAYMAN;;
+ -nl|--nolayman) s false LAYMAN;;
+ -x|--debug) s true DEBUG;;
+ -nx|--nodebug) s false DEBUG;;
+ *) usage;;
+ esac
+done
+
+run() {
+ echo "+ $*"
+ "$@"
+}
+if ${GS_DEBUG} ; then
+ set -x
+ run() { "$@" ; }
+fi
+
export NOCOLOR=true
(
+id
date
if ${GS_RSYNC} ; then
[[ -e ${f} ]] && . ${f} && break
done
done
+ > "${up_log}"
: ${PORTAGE_RSYNC_OPTS:=-azO --delete --exclude=/distfiles --exclude=/local --exclude=/packages}
: ${SYNC:=rsync://rsync.gentoo.org/gentoo-portage}
: ${PORTDIR:=/usr/portage}
- exec rsync ${PORTAGE_RSYNC_OPTS} ${PORTAGE_RSYNC_EXTRA_OPTS} ${SYNC}/ ${PORTDIR}/
+ exec rsync ${PORTAGE_RSYNC_OPTS} ${PORTAGE_RSYNC_EXTRA_OPTS} ${SYNC}/ ${PORTDIR}/ >& "${sync_log}"
+fi
+
+if ${GS_SYNC} ; then
+ run emerge --sync -q
+ date
+ ${GS_EUPDATEDB} && run $(type -P eupdatedb)
+ date
+ ${GS_LAYMAN} && l=$(type -P layman) && run ${l} -S -q
+ date
+ ${GS_FETCH} && run emerge world -Duf
+ #date
+ #q -qr
fi
-emerge --sync -q
-date
-${GS_EUPDATEDB} && $(type -P eupdatedb)
-date
-${GS_LAYMAN} && l=$(type -P layman) && ${l} -S -q
-date
-${GS_FETCH} && emerge world -Duf
-#q -qr
date
) >& ${sync_log}
if ${GS_UPWORLD} ; then
(
- eval $(portageq envvar -v PORTDIR)
- cd "${PORTDIR}"
- good_pkgs=$(ls -d `qlist -IC`)
- echo 'emerge -u1 --keep-going $(awk '\''$2 ~ /\// {print $2}'\'' '${up_log}')'
- emerge ${good_pkgs} -upq --cols
+ repos=(
+ $(portageq repositories_configuration / | awk '$1 == "location" { $1 = $2 = ""; print }')
+ )
+ bad_pkgs=()
+ good_pkgs=()
+ for p in `qlist -ICS` ; do
+ good=false
+ for repo in ${repos[@]} ; do
+ if [[ -d ${repo}/${p%:*} ]] ; then
+ good=true
+ break
+ fi
+ done
+
+ if ${good} ; then
+ good_pkgs+=( ${p} )
+ else
+ bad_pkgs+=( ${p} )
+ fi
+ done
+
+ if [[ ${#bad_pkgs[@]} -gt 0 ]] ; then
+ echo 'These packages no longer exist:'
+ printf '\t%s\n' "${bad_pkgs[@]}"
+ echo
+ fi
+ echo 'emerge -u1v --quiet-build y --keep-going $(awk '\''$2 ~ /\// {print $2}'\'' '${up_log}')'
+ emerge -upq --cols \
+ $(printf '%s\n' ${good_pkgs[*]} | grep -v '^cross-')
) >& ${up_log}
+ :
fi