X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=.bin%2Fgentoo-sync;h=c41f04dcacbec059e7b261e9ad7ec0c3a51b1706;hb=847136a30dbf711fc2ccab762fb294218c8004ea;hp=e52bb76f3de9923390b45271a2c7433a2763a951;hpb=c1eb2d1caa2d518b5f577bfb8ef46e966ea5f68d;p=home.git diff --git a/.bin/gentoo-sync b/.bin/gentoo-sync index e52bb76..c41f04d 100755 --- a/.bin/gentoo-sync +++ b/.bin/gentoo-sync @@ -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 -u1qv --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