#!/bin/sh STOW_DIR=/etc/portage/stow TARGET=/etc/portage stowcmd="stow -d "$STOW_DIR" -t "$TARGET"" need_root() { if test $(id -u) -ne 0; then printf 'This action requires superuser access.\n' exit 1 fi } add() { need_root $stowcmd -S "$@" } remove() { need_root $stowcmd -D "$@" } flush() { need_root list | xargs -- $stowcmd -D } rebuild() { need_root list | xargs -- $stowcmd -R } list() { subcmd="$1" shift case $subcmd in active) list_active;; all) list_all;; available) list_available;; *) list_active;; esac } list_active() { # XXX: -r for xargs is a GNU extension find /etc/portage/ -lname "*stow/*" -print0 2>/dev/null \ | xargs -r0 readlink \ | sed 's:.*stow/\([^/]\+\)/.*:\1:' \ | 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