#!/bin/sh export STOW_DIR=/etc/portage/stow need_root() { if test "$(id -u)" -ne 0; then printf 'This action requires superuser access.\n' exit 1 fi } add() { need_root stow -S "$@" } remove() { need_root stow -D "$@" } flush() { need_root list | xargs -- stow -D } rebuild() { need_root if test $# -gt 0; then stow -R "$@" else list | xargs -- stow -R fi } list() { subcmd="$1" shift case $subcmd in active) list_active;; all) list_all;; available) list_available;; *) list_active;; esac } list_active() { # Note: we de not escape any special characters in $STOW_DIR since it is # assumed we are in full control of its contents. # XXX: -r for xargs is a GNU extension find "$STOW_DIR/.." -type l -print0 2>/dev/null \ | xargs -r0 readlink -f \ | sed -n ":^$STOW_DIR: s:^$STOW_DIR/\([^/]\+\)/.*:\1:p" \ | sort -u } list_all() { ls -1 "$STOW_DIR" } list_available() { tmp="$(mktemp)" || exit 1 list_active > "$tmp" list_all | comm -13 "$tmp" - rm -f "$tmp" } cmd="$1" shift case $cmd in add) add "$@";; flush) flush;; list) list "$@";; rebuild) rebuild "$@";; remove) remove "$@";; *) list_active;; esac