Initial pre-release
tmux-party: share a tmux session with people on the same UNIX host. Single-file POSIX shell (party) with a filesystem + tmux server-access trust model. See README.md.
This commit is contained in:
commit
6be0ac1877
20 changed files with 3869 additions and 0 deletions
161
tools/post-install.sh
Executable file
161
tools/post-install.sh
Executable file
|
|
@ -0,0 +1,161 @@
|
|||
#!/bin/sh
|
||||
# tools/post-install.sh — wire system PATH after `make install`, and
|
||||
# reverse it on `make uninstall`. Idempotent on both sides.
|
||||
#
|
||||
# Usage: tools/post-install.sh <install|uninstall> <prefix>
|
||||
#
|
||||
# Behavior by host OS (uname -s):
|
||||
#
|
||||
# SunOS (illumos / Solaris) with prefix not in /usr or /usr/local:
|
||||
# Add or remove $prefix/bin to/from the PATH= line of /etc/default/login
|
||||
# (override with LOGIN_DEFAULTS=...). illumos man(1) derives the manpath
|
||||
# from PATH by replacing trailing /bin with /share/man, so wiring PATH
|
||||
# is enough for `man party` to work without -M.
|
||||
#
|
||||
# Linux / *BSD / macOS with prefix in {/usr, /usr/local}:
|
||||
# Already on default PATH and MANPATH. No-op.
|
||||
#
|
||||
# Anything else (custom PREFIX on Linux/BSD/macOS, or unknown OS):
|
||||
# Print the export lines the user needs to add to a shell rc.
|
||||
# Do not mutate any system file.
|
||||
#
|
||||
# DESTDIR-aware: the Makefile skips this script entirely when DESTDIR is set
|
||||
# (package staging context — mutating /etc on the build host is wrong).
|
||||
|
||||
set -eu
|
||||
|
||||
usage() {
|
||||
echo "usage: $0 <install|uninstall> <prefix>" >&2
|
||||
exit 2
|
||||
}
|
||||
|
||||
[ $# -eq 2 ] || usage
|
||||
action=$1
|
||||
prefix=$2
|
||||
case "$action" in install|uninstall) ;; *) usage ;; esac
|
||||
[ -n "$prefix" ] || usage
|
||||
|
||||
bindir="$prefix/bin"
|
||||
mandir="$prefix/share/man"
|
||||
LOGIN_DEFAULTS=${LOGIN_DEFAULTS:-/etc/default/login}
|
||||
uname_s=$(uname -s)
|
||||
|
||||
# Print install- or uninstall-side instructions for setting/clearing PATH and
|
||||
# MANPATH in a shell rc. Used when we don't (or won't) edit any system file.
|
||||
print_manual_instructions() {
|
||||
verb=$1 bd=$2 md=$3 osname=$4
|
||||
if [ "$osname" = "Linux" ] || [ "$osname" = "FreeBSD" ] || [ "$osname" = "NetBSD" ] \
|
||||
|| [ "$osname" = "OpenBSD" ] || [ "$osname" = "DragonFly" ] || [ "$osname" = "Darwin" ]; then
|
||||
header="PREFIX is non-standard on $osname; not modifying system files."
|
||||
else
|
||||
header="Unrecognized OS '$osname'; not modifying system files."
|
||||
fi
|
||||
if [ "$verb" = "install" ]; then
|
||||
cat <<EOF
|
||||
$header
|
||||
For 'party' and 'man party' to work in fresh shells, add to your shell rc:
|
||||
|
||||
export PATH="$bd:\$PATH"
|
||||
export MANPATH="$md:\$MANPATH"
|
||||
EOF
|
||||
else
|
||||
cat <<EOF
|
||||
$header
|
||||
If you previously added these to your shell rc, remove them:
|
||||
|
||||
export PATH="$bd:\$PATH"
|
||||
export MANPATH="$md:\$MANPATH"
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
|
||||
# Idempotently add ($verb=install) or remove ($verb=uninstall) $needle as a
|
||||
# component of the PATH= line in $file. Returns 0 in all expected cases —
|
||||
# only awk/IO failures bubble up as nonzero. Prints what it did.
|
||||
edit_path_line() {
|
||||
verb=$1 file=$2 needle=$3
|
||||
|
||||
if [ ! -f "$file" ]; then
|
||||
echo "$file does not exist; skipping PATH wiring." >&2
|
||||
return 0
|
||||
fi
|
||||
if [ ! -w "$file" ]; then
|
||||
echo "$file is not writable (run as root); skipping PATH wiring." >&2
|
||||
return 0
|
||||
fi
|
||||
|
||||
tmpf="$file.party.tmp.$$"
|
||||
# awk exits 0 if it modified the file, 1 if no change was needed.
|
||||
if awk -v verb="$verb" -v needle="$needle" '
|
||||
BEGIN { changed = 0; path_seen = 0 }
|
||||
/^PATH=/ && !path_seen {
|
||||
path_seen = 1
|
||||
val = substr($0, 6)
|
||||
n = split(val, parts, ":")
|
||||
present = 0
|
||||
for (i = 1; i <= n; i++) if (parts[i] == needle) present = 1
|
||||
|
||||
if (verb == "install") {
|
||||
if (present) { print; next }
|
||||
if (val == "") print "PATH=" needle
|
||||
else print $0 ":" needle
|
||||
changed = 1
|
||||
next
|
||||
}
|
||||
if (verb == "uninstall") {
|
||||
if (!present) { print; next }
|
||||
out = ""
|
||||
for (i = 1; i <= n; i++) {
|
||||
if (parts[i] == needle) continue
|
||||
out = (out == "" ? parts[i] : out ":" parts[i])
|
||||
}
|
||||
print "PATH=" out
|
||||
changed = 1
|
||||
next
|
||||
}
|
||||
}
|
||||
{ print }
|
||||
END { exit changed ? 0 : 1 }
|
||||
' "$file" > "$tmpf"; then
|
||||
ts=$(date +%Y%m%d%H%M%S)
|
||||
cp -p "$file" "$file.before-party.$ts"
|
||||
mv "$tmpf" "$file"
|
||||
case "$verb" in
|
||||
install) echo "Added $needle to PATH in $file (backup: $file.before-party.$ts)" ;;
|
||||
uninstall) echo "Removed $needle from PATH in $file (backup: $file.before-party.$ts)" ;;
|
||||
esac
|
||||
else
|
||||
rm -f "$tmpf"
|
||||
case "$verb" in
|
||||
install) echo "$needle already in PATH in $file; nothing to do." ;;
|
||||
uninstall) echo "$needle not in PATH in $file; nothing to do." ;;
|
||||
esac
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
case "$uname_s" in
|
||||
SunOS)
|
||||
case "$prefix" in
|
||||
/usr|/usr/local)
|
||||
echo "$prefix is on the default illumos PATH; no system wiring needed."
|
||||
;;
|
||||
*)
|
||||
edit_path_line "$action" "$LOGIN_DEFAULTS" "$bindir"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
Linux|FreeBSD|NetBSD|OpenBSD|DragonFly|Darwin)
|
||||
case "$prefix" in
|
||||
/usr|/usr/local)
|
||||
: # already on PATH and MANPATH on these platforms
|
||||
;;
|
||||
*)
|
||||
print_manual_instructions "$action" "$bindir" "$mandir" "$uname_s"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*)
|
||||
print_manual_instructions "$action" "$bindir" "$mandir" "$uname_s"
|
||||
;;
|
||||
esac
|
||||
Loading…
Add table
Add a link
Reference in a new issue