diff options
Diffstat (limited to 'rolectl')
-rwxr-xr-x | rolectl | 74 |
1 files changed, 74 insertions, 0 deletions
@@ -0,0 +1,74 @@ +#!/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 |