1
0
Fork 0
mirror of https://github.com/notwa/rc synced 2024-06-29 02:17:12 -07:00
rc/sh/e

69 lines
1.9 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env sh
2021-07-29 00:37:35 -07:00
# YES_ZSH
# YES_BASH
# YES_DASH
# YES_ASH
2021-10-04 17:06:45 -07:00
# YES_BB_AWK
2021-10-01 12:00:23 -07:00
2021-07-30 17:57:08 -07:00
e() { ### @-
### wrap around `$EDITOR` to run it as root if necessary.
### this still needs some work to detect root-owned directories.
###
### ```
### $ e /etc/sudoers
### [sudo] password for notwa:
### ```
2021-07-29 00:37:35 -07:00
[ -z "$ZSH_OPTIONS" ] || setopt local_options sh_word_split
local f= d= running= editor= needroot=0
2013-06-28 05:22:14 -07:00
editor="${EDITOR%% *}"
2019-06-05 20:14:29 -07:00
(running pid cmd | while read -r pid cmd; do
if [ "$cmd" = "$editor" ]; then
printf "%s (%s)\n" "$editor is already running" "$pid" >&2
confirm
exit
fi
done) || return
2021-07-29 00:37:35 -07:00
for f in "$@"; do
f="$(readlink -f "$f")" || continue
[ -z "$MSYSTEM" ] || f="$(cygpath -u "$f")" || continue
2021-07-29 00:37:35 -07:00
# easy: file exists, we have write permissions
[ -w "$f" ] && continue
# easy: file exists, but no write permissions
[ -e "$f" ] && { needroot=1; break; }
2021-07-29 00:37:35 -07:00
# hard: file may be in a directory that we can't inspect
d="$f"
while [ "${d%/*}" != "$d" ]; do
2021-07-29 00:37:35 -07:00
d="${d%/*}"
# NOTE: this gets weird with the root directory, not sure how to handle
[ -e "$d" ] && [ ! -w "$d" ] && { needroot=1 && break; }
done
[ $needroot -eq 1 ] && break
# easy: file just doesn't exist
2019-06-05 20:14:29 -07:00
done
if [ $needroot -eq 1 ] && [ -n "$MSYSTEM" ]; then
# this pretty much never happens, because permissions are so busted, but...
printf "NOTE: you need root permissions, but this is Windows." >&2
printf " this probably isn't going to work." >&2
pause
$EDITOR "$@"
elif [ $needroot -eq 0 ]; then
$EDITOR "$@"
2021-07-29 00:37:35 -07:00
else
sudo -e "$@"
fi
}
2013-06-28 05:22:14 -07:00
[ -n "${preload+-}" ] || . ~/sh/preload || exit 2
eval ${preload:-preload} running confirm pause
[ -n "${preload+-}" ] || e "$@"