]> git.wh0rd.org - home.git/blobdiff - .bin/gentoo-sync
gentoo-sync: ignore final exit status
[home.git] / .bin / gentoo-sync
index 347713d2f952d52f028b705b2185e5e5e10baba3..c41f04dcacbec059e7b261e9ad7ec0c3a51b1706 100755 (executable)
@@ -1,20 +1,91 @@
 #!/bin/bash
 
-[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$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
 conf="/etc/gentoo-sync.conf"
 [[ -e ${conf} ]] && . "${conf}"
 
+bootstrap() {
+       [[ "${FLOCKER}" != "$0" ]] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@"
+       [[ $(id -u) -eq 0 ]] || exec sudo env -uUNSHARE FLOCKER="${FLOCKER}" HOME="$HOME" "$0" "$@"
+
+       if [[ -z ${UNSHARE} ]] ; then
+               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
+                       UNSHARE=true exec unshare "${uargs[@]}" -- "$0" "$@"
+               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
+
+${GS_DEBUG} && set -x
+
+logdir="/var/log"
+sync_log="${logdir}/rsync.log"
+up_log="${logdir}/emerge-updates.log"
+
 export NOCOLOR=true
 
 (
@@ -51,23 +122,35 @@ date
 
 if ${GS_UPWORLD} ; then
        (
-       eval $(portageq envvar -v PORTDIR)
-       cd "${PORTDIR}"
+       repos=(
+               $(portageq repositories_configuration / | awk '$1 == "location" { $1 = $2 = ""; print }')
+       )
        bad_pkgs=()
        good_pkgs=()
        for p in `qlist -ICS` ; do
-               if [[ -d ${p%:*} ]] ; then
+               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 -u1 --keep-going $(awk '\''$2 ~ /\// {print $2}'\'' '${up_log}')'
-       emerge ${good_pkgs[*]} -upq --cols
+       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