]> git.wh0rd.org - home.git/blobdiff - .bin/gentoo-sync
cros-board: update
[home.git] / .bin / gentoo-sync
index 1d76859398a13120c9c70a7fc837e9a8eb117a82..6984c38001674f87a2d0b2982177ddf750ec41db 100755 (executable)
 #!/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
@@ -27,29 +119,59 @@ 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