mirror of
https://github.com/notwa/rc
synced 2024-11-05 07:19:02 -08:00
Connor Olding
e627d7d22a
rationale: is_empty searches the directory for actual files, whereas rmdir checks for directories too, so rmdir could fail.
144 lines
3.5 KiB
Bash
Executable file
144 lines
3.5 KiB
Bash
Executable file
#!/usr/bin/env sh
|
|
# this script is compatible with following shells:
|
|
# dash, ash, bash, zsh
|
|
|
|
note() {
|
|
printf "%s\n" "$@"
|
|
}
|
|
|
|
warn() {
|
|
printf "%s\n" "$@" >&2
|
|
}
|
|
|
|
die() {
|
|
warn "$@"
|
|
exit 1
|
|
}
|
|
|
|
dotless() {
|
|
local f="$1"
|
|
local ind="$(expr index "$f" .)"
|
|
if [ "$ind" -gt 0 ]; then
|
|
local len="$(expr length "$f")"
|
|
REPLY="$(expr substr "$f" 2 "$len")"
|
|
else
|
|
REPLY="$1"
|
|
fi
|
|
#warn "$f -> $REPLY"
|
|
}
|
|
|
|
backup() {
|
|
note "backing up $1"
|
|
mkdir -p "${backup_dir:?backup_dir unset}/$(dirname "$1")"
|
|
[ -e "$backup_dir/$1" ] && die "backup already exists"
|
|
mv "$1" "$backup_dir/$1"
|
|
}
|
|
|
|
hardlink() {
|
|
if [ -e "$1" ]; then
|
|
[ "$1" -ef "$2" ] && return
|
|
[ -h "$1" ] && note "removing symbolic link $1" && rm "$1"
|
|
if [ -s "$1" ]; then
|
|
backup "$1" || die "$1 already exists"
|
|
fi
|
|
fi
|
|
|
|
ln "$2" "$1" || die "couldn't hardlink $1"
|
|
}
|
|
|
|
softlink_nix() {
|
|
if [ -e "$1" ]; then
|
|
if [ -h "$1" ]; then
|
|
[ "$(readlink "$1")" = "$2" ] && return
|
|
note "removing symbolic link $1"
|
|
rm "$1"
|
|
else
|
|
die "$1 already exists and is not a symbolic link"
|
|
fi
|
|
fi
|
|
|
|
ln -s "$2" "$1" || die "couldn't symlink $1"
|
|
}
|
|
|
|
softlink_pseudo() {
|
|
[ -d "$2" ] || die "$1 is not a directory to softlink"
|
|
|
|
if [ ! -d "$1" ]; then
|
|
mkdir "$1" || die "couldn't mkdir $1"
|
|
fi
|
|
|
|
ls -A "$2" | while read -r REPLY; do
|
|
local d1="$1/$REPLY"
|
|
local d2="$2/$REPLY"
|
|
if [ -d "$d2" ]; then
|
|
if [ "$d1" != ".vim/bundle" ]; then # buggy on Windows
|
|
#warn $'\e[34m / \e[0m' "$d1 $d2"
|
|
softlink_pseudo "$d1" "$d2" || exit 1
|
|
fi
|
|
elif [ -f "$d2" ]; then
|
|
#warn $'\e[34m * \e[0m' "$d1"
|
|
hardlink "$d1" "$d2"
|
|
else
|
|
die "i don't know how to pseudo-symlink $d2"
|
|
fi
|
|
done
|
|
|
|
ls -A "$1" | while read -r REPLY; do
|
|
local d1="$1/$REPLY"
|
|
local d2="$2/$REPLY"
|
|
if [ -d "$d2" ]; then
|
|
:
|
|
elif [ ! "$d1" -ef "$d2" ]; then
|
|
[ "$d1" = ".vim/.netrwhist" ] && continue
|
|
[ "$d1" = ".vim/backup" ] && continue
|
|
[ "$d1" = ".vim/bundle" ] && continue
|
|
[ "$d1" = ".vim/swp" ] && continue
|
|
[ "$d1" = ".vim/undo" ] && continue
|
|
#warn "new destination file. consider manually moving it:"
|
|
#warn $'\e[32m + \e[0m' "$d1"
|
|
warn ' + ' "$d1"
|
|
fi
|
|
done
|
|
}
|
|
|
|
softlink() {
|
|
if [ -n "$MSYSTEM" ]; then
|
|
# MSYS2 does not have nor emulate symbolic links.
|
|
softlink_pseudo "$@" || exit 1
|
|
else
|
|
softlink_nix "$@"
|
|
fi
|
|
}
|
|
|
|
which readlink >/dev/null || exit 1 # sanity check
|
|
|
|
rc="$(readlink -f "$(dirname "$0")" )"
|
|
cd "$HOME"
|
|
PATH="${PATH:?No existing PATH}:$rc/sh"
|
|
|
|
backup_dir="$rc/backup-$(date -u '+%s')"
|
|
|
|
for f in .bashrc .zshrc .-shrc .arrays .streamcrap .ea .vimrc \
|
|
.inputrc .Xresources .screenrc .tmux.conf; do
|
|
dotless "$f"
|
|
r="$rc/home/$REPLY"
|
|
hardlink "$f" "$r"
|
|
done
|
|
|
|
for d in sh .vim .mpv; do
|
|
dotless "$d"
|
|
r="$rc/$REPLY"
|
|
softlink "$d" "$r"
|
|
done
|
|
|
|
if [ ! -e .bash_profile ] || ! grep -qF .bashrc .bash_profile; then
|
|
echo >> .bash_profile
|
|
echo '[[ -f ~/.bashrc ]] && . ~/.bashrc' >> .bash_profile
|
|
fi
|
|
|
|
for d in Desktop Documents Downloads Music Pictures Public Templates Video Videos; do
|
|
[ -d "$d" ] || continue
|
|
is_empty "$d" && rm -r "$d" || note "skipping unempty $d"
|
|
done
|
|
|
|
mkdir -p opt/local/bin src work play
|