mirror of
https://github.com/jimeh/dotfiles.git
synced 2026-02-19 04:46:41 +00:00
Volta installs all global packages into their own separate sandbox, with no other packages installed in the same node_modules directory. This hack abuses the fact that prettier can be configured with a *.js file, and effectively scans the volta installation directory for sandboxes for prettier plugins, and sets anything it finds as the "pluginSearchDirs" list.
294 lines
6.3 KiB
Bash
Executable File
294 lines
6.3 KiB
Bash
Executable File
#! /usr/bin/env bash
|
|
|
|
#
|
|
# Configuration
|
|
#
|
|
|
|
TARGET="$HOME"
|
|
DOTFILES_LINK=".dotfiles"
|
|
SYMLINK_PATH="$DOTFILES_LINK"
|
|
PRIVATE_PATH="private"
|
|
SYMLINKS=(
|
|
Brewfile
|
|
ackrc
|
|
alacritty.yml
|
|
bitbar
|
|
coffeelint.json
|
|
config/kitty/kitty.conf
|
|
config/solargraph/config.yml
|
|
config/starship.toml
|
|
erlang
|
|
eslintrc.js
|
|
gemrc
|
|
gitconfig
|
|
gitignore
|
|
hammerspoon
|
|
hgrc
|
|
hyper.js
|
|
irbrc
|
|
peco
|
|
powconfig
|
|
prettierrc.js
|
|
pryrc
|
|
reek.yml
|
|
rspec
|
|
rubocop.yml
|
|
tmux
|
|
tmux.conf
|
|
zshenv
|
|
zshrc
|
|
)
|
|
|
|
#
|
|
# Initial Setup
|
|
#
|
|
|
|
if [ -n "${BASH_SOURCE[0]}" ] && [ -f "${BASH_SOURCE[0]}" ]; then
|
|
ROOT_PATH=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
elif [ -n "$0" ] && [ -f "$0" ]; then
|
|
ROOT_PATH=$(cd "$(dirname "$0")" && pwd)
|
|
else
|
|
echo "[ERROR] Can't determine dotfiles' root path."
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# Main Functions
|
|
#
|
|
|
|
install_symlinks() {
|
|
# Symlink dotfiles root
|
|
symlink "$ROOT_PATH" "$TARGET/$DOTFILES_LINK"
|
|
|
|
# Setup private dotfiles
|
|
if [ -f "$ROOT_PATH/$PRIVATE_PATH/install.sh" ]; then
|
|
"$ROOT_PATH/$PRIVATE_PATH/install.sh" symlinks
|
|
fi
|
|
|
|
# Symlink each path
|
|
for i in "${SYMLINKS[@]}"; do
|
|
dot_symlink "$i" "$SYMLINK_PATH" "$TARGET"
|
|
done
|
|
}
|
|
|
|
install_private() {
|
|
git_clone "git@github.com:jimeh/dotfiles-private.git" \
|
|
"$ROOT_PATH/$PRIVATE_PATH"
|
|
}
|
|
|
|
install_launch_agents() {
|
|
mkdir -p "$HOME/Library/LaunchAgents"
|
|
for file in $ROOT_PATH/launch_agents/*.plist; do
|
|
symlink "$file" "$HOME/Library/LaunchAgents/$(basename "$file")"
|
|
done
|
|
|
|
# Setup private launch_agents
|
|
if [ -f "$ROOT_PATH/$PRIVATE_PATH/install.sh" ]; then
|
|
"$ROOT_PATH/$PRIVATE_PATH/install.sh" launch-agents
|
|
fi
|
|
}
|
|
|
|
install_xbar_scripts() {
|
|
mkdir -p "$HOME/Library/Application Support/xbar/plugins"
|
|
for file in $ROOT_PATH/xbar/*; do
|
|
symlink "$file" "$HOME/Library/Application Support/xbar/plugins/$(basename "$file")"
|
|
done
|
|
}
|
|
|
|
install_terminfo() {
|
|
for file in $ROOT_PATH/terminfo/*.terminfo; do
|
|
log ok "tic -x" "$file"
|
|
tic -x "$file"
|
|
done
|
|
}
|
|
|
|
install_homebrew() {
|
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
|
|
}
|
|
|
|
install_rbenv() {
|
|
git_clone 'https://github.com/rbenv/rbenv.git' "$TARGET/.rbenv"
|
|
git_clone 'https://github.com/rbenv/ruby-build.git' "$TARGET/.rbenv/plugins/ruby-build"
|
|
}
|
|
|
|
install_emacs_config() {
|
|
git_clone 'https://github.com/plexus/chemacs2.git' "$TARGET/.config/chemacs2"
|
|
symlink "$TARGET/.config/chemacs2" "$TARGET/.emacs.d"
|
|
git_clone 'git@github.com:jimeh/.emacs.d.git' "$TARGET/.config/emacs-siren"
|
|
}
|
|
|
|
#
|
|
# Helper functions
|
|
#
|
|
|
|
# Colors
|
|
C_RED="$(tput setaf 1)"
|
|
C_GREEN="$(tput setaf 2)"
|
|
C_YELLOW="$(tput setaf 3)"
|
|
C_BLUE="$(tput setaf 4)"
|
|
C_MAGENTA="$(tput setaf 5)"
|
|
C_CYAN="$(tput setaf 6)"
|
|
C_GREY="$(tput setaf 7)"
|
|
C_RESET="$(tput sgr0)"
|
|
|
|
# Symbols
|
|
S_RARROW="${C_CYAN}-->${C_RESET}"
|
|
|
|
log() {
|
|
local type="$1"
|
|
local prefix="$2"
|
|
shift 2
|
|
local message="$@"
|
|
|
|
type="$(echo "$type" | tr '[:lower:]' '[:upper:]')"
|
|
case "$type" in
|
|
OK)
|
|
type="${C_GREEN}${type}:${C_RESET}"
|
|
;;
|
|
WARN | ERROR)
|
|
type="${C_RED}${type}:${C_RESET}"
|
|
;;
|
|
*)
|
|
type="${C_YELLOW}${type}:${C_RESET}"
|
|
;;
|
|
esac
|
|
|
|
if [ -n "$prefix" ]; then
|
|
prefix="${C_GREY}${prefix}: ${C_RESET}"
|
|
fi
|
|
|
|
printf "${type}\t${prefix}${message}\n"
|
|
}
|
|
|
|
symlink() {
|
|
local source="$1"
|
|
local target="$2"
|
|
local target_dir
|
|
local linksource
|
|
|
|
if [ "$target" == "$source" ]; then
|
|
log ok symlink "$target"
|
|
elif [ ! -e "$target" ] && [ ! -L "$target" ]; then
|
|
log link symlink "$target ${S_RARROW} $source"
|
|
|
|
target_dir="$(dirname "$target")"
|
|
if [ ! -d "$target_dir" ]; then
|
|
mkdir -p "$target_dir"
|
|
fi
|
|
ln -s "$source" "$target"
|
|
elif [ -L "$target" ]; then
|
|
linksource="$(readlink "$target")"
|
|
if [ "$linksource" == "$source" ]; then
|
|
log ok symlink "$target ${S_RARROW} $source"
|
|
else
|
|
log warn symlink "$target ${S_RARROW} $linksource" \
|
|
"${C_CYAN}(should be ${C_RESET}$source${C_CYAN})${C_RESET}"
|
|
fi
|
|
elif [ -f "$target" ]; then
|
|
log warn symlink "$target exists and is a file"
|
|
elif [ -d "$target" ]; then
|
|
log warn symlink "$target exists and is a directory"
|
|
else
|
|
log warn symlink "$target exists"
|
|
fi
|
|
}
|
|
|
|
dot_symlink() {
|
|
local name="$1"
|
|
local source="$2/${name}"
|
|
local target="$3/.${name}"
|
|
local cur_name
|
|
|
|
if [ "$(dirname "$name")" != "." ] && [ "$(dirname "$name")" != "/" ]; then
|
|
cur_name="$(dirname "$name")"
|
|
while [ "$cur_name" != "." ] && [ "$cur_name" != "/" ]; do
|
|
source="../${source}"
|
|
cur_name="$(dirname "$cur_name")"
|
|
done
|
|
fi
|
|
|
|
symlink "$source" "$target"
|
|
}
|
|
|
|
git_clone() {
|
|
local clone_url="$1"
|
|
local target="$2"
|
|
|
|
if [ ! -e "$target" ]; then
|
|
git clone "$clone_url" "$target"
|
|
log ok git-clone "$clone_url ${S_RARROW} $target"
|
|
else
|
|
log info git-clone "$target already exists"
|
|
fi
|
|
}
|
|
|
|
zsh_init() {
|
|
zsh -l -i -c 'exit'
|
|
}
|
|
|
|
#
|
|
# Argument Handling
|
|
#
|
|
|
|
display_help() {
|
|
echo 'usage: ./install.sh [-h/--help] [<command>]'
|
|
echo ''
|
|
echo 'Available commands:'
|
|
echo ' <none>: Run symlinks and shell_init commands.'
|
|
echo ' symlinks: Install symlinks for dotfiles into target directory.'
|
|
echo ' shell_init: Launch zsh instance so zinit installs all deps.'
|
|
echo ' info: Display target and source directory information.'
|
|
echo ' emacs_config: Install Emacs configuration.'
|
|
echo ' private: Install private dotfiles.'
|
|
echo ' homebrew: Install Homebrew (Mac OS X only).'
|
|
echo ' rbenv: Install rbenv, a Ruby version manager.'
|
|
echo ' launch_agents: Install launchd plists to ~/Library/LaunchAgents/'
|
|
echo ' help: Display this message.'
|
|
}
|
|
|
|
if [[ " $* " == *" --help "* ]] || [[ " $* " == *" -h "* ]]; then
|
|
display_help
|
|
exit
|
|
fi
|
|
|
|
case "$1" in
|
|
"help")
|
|
display_help
|
|
;;
|
|
emacs_config | emacs-config | emacs)
|
|
install_emacs_config
|
|
;;
|
|
private)
|
|
install_private
|
|
;;
|
|
homebrew | brew)
|
|
install_homebrew
|
|
;;
|
|
rbenv)
|
|
install_rbenv
|
|
;;
|
|
launch_agents | launch-agents | agents)
|
|
install_launch_agents
|
|
;;
|
|
xbar_scripts | xbar-scripts | xbar)
|
|
install_xbar_scripts
|
|
;;
|
|
terminfo)
|
|
install_terminfo
|
|
;;
|
|
info)
|
|
echo "Target directory: $TARGET"
|
|
echo "Detected dotfiles root: $ROOT_PATH"
|
|
;;
|
|
shell_init | shell-init)
|
|
zsh_init
|
|
;;
|
|
symlinks | links)
|
|
install_symlinks
|
|
;;
|
|
*)
|
|
install_symlinks
|
|
zsh_init
|
|
;;
|
|
esac
|