migrate to stow
This commit is contained in:
parent
5050bee3c9
commit
6692186711
26
README.md
26
README.md
@ -50,31 +50,7 @@ echo "Hello $USER!"
|
|||||||
```bash
|
```bash
|
||||||
git clone https://github.com/TheK4n/dotfiles
|
git clone https://github.com/TheK4n/dotfiles
|
||||||
cd dotfiles
|
cd dotfiles
|
||||||
./install zsh nvim ...
|
stow -R --target ~/.config home/user/.config
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Installation script
|
|
||||||
Per-user dotfiles "package" manager
|
|
||||||
|
|
||||||
### Features
|
|
||||||
1. Installing files from dotfiles/home/user to $HOME
|
|
||||||
2. Uninstalling installed files
|
|
||||||
3. Check installation integrity
|
|
||||||
4. Transaction based installation
|
|
||||||
5. Does not overwrite your configs
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
* bash
|
|
||||||
* coreutils
|
|
||||||
* diffutils
|
|
||||||
* grep
|
|
||||||
|
|
||||||
|
|
||||||
### Optional dependencies
|
|
||||||
* git
|
|
||||||
* wget
|
|
||||||
* unzip
|
|
||||||
|
|
||||||
|
|
||||||
<h1 align="center"><a href="#top">▲</a></h1>
|
<h1 align="center"><a href="#top">▲</a></h1>
|
||||||
210
install
210
install
@ -1,210 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -ueo pipefail
|
|
||||||
shopt -s nullglob
|
|
||||||
|
|
||||||
declare -r TARGET_PATH="$HOME"
|
|
||||||
declare -r DOTFILES_ROOT="$PWD"
|
|
||||||
declare -xr SUB="$DOTFILES_ROOT/home/user"
|
|
||||||
|
|
||||||
|
|
||||||
declare -r -A TARGETS=(
|
|
||||||
["bash"]=".config/bash .bashrc .profile"
|
|
||||||
["zsh"]="%bash .config/zsh .zshenv .inputrc"
|
|
||||||
["tmux"]=".tmux.conf"
|
|
||||||
["alacritty"]=".config/alacritty"
|
|
||||||
["nvim"]=".config/nvim .editorconfig .local/bin/vim_askpass_helper"
|
|
||||||
["ssh"]=""
|
|
||||||
["less"]=".lesskey"
|
|
||||||
["git"]=".config/git"
|
|
||||||
["ranger"]=".config/ranger"
|
|
||||||
["gpg"]=""
|
|
||||||
["i3"]=".xinitrc .xprofile .Xresources .config/i3 .config/i3status .local/bin/i3status_wrapper .config/rofi .config/picom .local/bin/slm .local/bin/slm_rofi.sh .local/bin/power_rofi.sh .local/bin/wifi .local/bin/bluetooth .local/bin/i3_switch_workspace.sh"
|
|
||||||
["bat"]=".config/bat"
|
|
||||||
["font"]=""
|
|
||||||
["termux"]=".termux"
|
|
||||||
["arch"]=""
|
|
||||||
["psql"]=".psqlrc"
|
|
||||||
["docker"]=".docker/cli-plugins"
|
|
||||||
["ipython"]=".ipython/profile_default/ipython_config.py"
|
|
||||||
["gdb"]=".config/gdb"
|
|
||||||
)
|
|
||||||
|
|
||||||
_die() {
|
|
||||||
echo "$0: $1" >&2
|
|
||||||
exit $2
|
|
||||||
}
|
|
||||||
|
|
||||||
test "$0" = "./install" || _die "Error: Please, run this file from root of dotfiles, like this './install.sh TARGET" 1
|
|
||||||
|
|
||||||
|
|
||||||
_link_files_in_sandbox() {
|
|
||||||
local targetfile
|
|
||||||
for targetfile in "$@"
|
|
||||||
do
|
|
||||||
echo "installing: $targetfile"
|
|
||||||
if [ "${targetfile::1}" = "%" ]; then
|
|
||||||
_link_files_in_sandbox ${TARGETS["${targetfile:1}"]}
|
|
||||||
else
|
|
||||||
if [ ! "$(dirname "$targetfile")" = "." ]; then
|
|
||||||
mkdir -p "$SANDBOX_PATH/$(dirname "$targetfile")"
|
|
||||||
fi
|
|
||||||
ln -sT "$SUB/$targetfile" "$SANDBOX_PATH/$targetfile"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
_compare_sandbox_to_home() {
|
|
||||||
local comparisons
|
|
||||||
comparisons="$(diff -rq "$SANDBOX_PATH" "$TARGET_PATH")"
|
|
||||||
echo "$comparisons" | grep -vE "^Only in .+" || true
|
|
||||||
}
|
|
||||||
|
|
||||||
_merge_sandbox_to_home() {
|
|
||||||
cp -RTnP "$SANDBOX_PATH" "$TARGET_PATH" || true
|
|
||||||
}
|
|
||||||
|
|
||||||
__install_from_sandbox() {
|
|
||||||
local comparisons
|
|
||||||
comparisons="$(_compare_sandbox_to_home)"
|
|
||||||
|
|
||||||
if [ -n "$comparisons" ]; then
|
|
||||||
echo "$comparisons" >&2
|
|
||||||
_die "Found conflicting files. Exiting" 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Merging to home..."
|
|
||||||
_merge_sandbox_to_home
|
|
||||||
echo "Successfully installed"
|
|
||||||
}
|
|
||||||
|
|
||||||
_execute_hook_if_executable() {
|
|
||||||
local hook_path="$DOTFILES_ROOT/install-hooks/$1/$2"
|
|
||||||
if [ -x "$hook_path" ]; then
|
|
||||||
echo "Executing $2 for target '$1'"
|
|
||||||
"$hook_path"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
execute_pre_hook() {
|
|
||||||
_execute_hook_if_executable "$1" "pre-install"
|
|
||||||
}
|
|
||||||
|
|
||||||
execute_post_hook() {
|
|
||||||
_execute_hook_if_executable "$1" "post-install"
|
|
||||||
}
|
|
||||||
|
|
||||||
install_target() {
|
|
||||||
execute_pre_hook "$1"
|
|
||||||
_link_files_in_sandbox ${TARGETS["$1"]}
|
|
||||||
__install_from_sandbox
|
|
||||||
execute_post_hook "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
is_target_installed() {
|
|
||||||
local not_fully_installed=false
|
|
||||||
|
|
||||||
local targetfile
|
|
||||||
for targetfile in ${TARGETS["$1"]}
|
|
||||||
do
|
|
||||||
if [ "${targetfile::1}" = "%" ]; then
|
|
||||||
is_target_installed "${targetfile:1}" || not_fully_installed=true
|
|
||||||
else
|
|
||||||
if [ ! -e "$TARGET_PATH/$targetfile" ]; then
|
|
||||||
echo "$targetfile not linked"
|
|
||||||
not_fully_installed=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if $not_fully_installed; then
|
|
||||||
echo "Target '$1' not fully installed"
|
|
||||||
echo
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
find_targets_that_depend_on() {
|
|
||||||
local target
|
|
||||||
for target in "${!TARGETS[@]}"
|
|
||||||
do
|
|
||||||
if [[ " ${TARGETS["$target"]} " =~ " %$1 " ]]; then
|
|
||||||
echo "$target"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
die_if_installed_targets_depend_on() {
|
|
||||||
for reverse_dependecy in $(find_targets_that_depend_on "$1")
|
|
||||||
do
|
|
||||||
if is_target_installed "$reverse_dependecy" >/dev/null; then
|
|
||||||
_die "target '$reverse_dependecy' is depends on installed target '$1'. Exiting..." 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd_unlink() {
|
|
||||||
local target targetfile
|
|
||||||
for target in "$@"
|
|
||||||
do
|
|
||||||
die_if_installed_targets_depend_on "$target"
|
|
||||||
|
|
||||||
for targetfile in ${TARGETS["$target"]}
|
|
||||||
do
|
|
||||||
if [ "${targetfile::1}" = "%" ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -e "$TARGET_PATH/$targetfile" ]; then
|
|
||||||
unlink "$TARGET_PATH/$targetfile"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd_no_target() {
|
|
||||||
_die "TARGET not exists" 1
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd_list() {
|
|
||||||
echo "${!TARGETS[@]}"
|
|
||||||
}
|
|
||||||
|
|
||||||
target_exists() {
|
|
||||||
[[ " ${!TARGETS[*]} " =~ " $1 " ]]
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd_install() {
|
|
||||||
local target
|
|
||||||
for target in "$@"
|
|
||||||
do
|
|
||||||
if target_exists "$target"; then
|
|
||||||
SANDBOX_PATH="$(mktemp -td "${USER:-user}.dotfiles_XXXXXXX")"
|
|
||||||
export SANDBOX_PATH
|
|
||||||
install_target "$target"
|
|
||||||
rm -rf "$SANDBOX_PATH"
|
|
||||||
else
|
|
||||||
cmd_no_target
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd_help() {
|
|
||||||
echo "Dotfiles installation script:
|
|
||||||
Usage: ./install TARGET...
|
|
||||||
Usage: ./install unlink TARGET...
|
|
||||||
Usage: ./install check TARGET
|
|
||||||
Usage: ./install list"
|
|
||||||
}
|
|
||||||
|
|
||||||
unset executed_command
|
|
||||||
readonly executed_command="$1"
|
|
||||||
|
|
||||||
case "$executed_command" in
|
|
||||||
unlink) shift; cmd_unlink "$@" ;;
|
|
||||||
check) shift; is_target_installed "$@" ;;
|
|
||||||
list) shift; cmd_list "$@" ;;
|
|
||||||
help) shift; cmd_help "$@" ;;
|
|
||||||
*) shift; cmd_install "$executed_command" "$@" ;;
|
|
||||||
esac
|
|
||||||
exit 0
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
echo 'echo "ParallelDownloads = 5" >> /etc/pacman.conf'
|
|
||||||
echo 'sudo systemctl enable --now gpm'
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
sub="$HOME/.local/share/fonts"
|
|
||||||
|
|
||||||
mkdir -p "$sub"
|
|
||||||
cd "$sub"
|
|
||||||
wget 'https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/FiraCode.zip'
|
|
||||||
unzip FiraCode.zip -d "$sub"
|
|
||||||
git clone 'https://github.com/powerline/fonts.git' --depth=1
|
|
||||||
cd fonts
|
|
||||||
./install.sh
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
git config --global user.name "$USER"
|
|
||||||
git config --global user.email "${USER}@${HOST:-$HOSTNAME}"
|
|
||||||
git config --global user.signingkey "$USER"
|
|
||||||
|
|
||||||
git config --global github.user "$USER"
|
|
||||||
git config --global github.email "${USER}@${HOST:-$HOSTNAME}"
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
cat "$SUB/.gnupg/gpg.conf" >> "$HOME/.gnupg/gpg.conf"
|
|
||||||
echo -e "default-cache-ttl 1\nmax-cache-ttl 1" > "$HOME/.gnupg/gpg-agent.conf"; echo RELOADAGENT | gpg-connect-agent
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
echo "sudo pacman -S nitrogen picom compton ttf-font-awesome xdotool xclip maim playerctl rofi"
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
echo "sudo pacman -S npm ctags fzf glow; mkdir ~/.npm-global; npm config set prefix '~/.npm-global'"
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
mkdir -p "$SANDBOX_PATH/.config/ranger/plugins"
|
|
||||||
git clone https://github.com/alexanderjeurissen/ranger_devicons "$SANDBOX_PATH/.config/ranger/plugins/ranger_devicons"
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
echo "sudo pacman -S highlight ttf-joypixels noto-fonts-emoji ueberzug poppler"
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
cat "$SUB/.ssh/config" >> "$HOME/.ssh/config"
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
cat > "$HOME/.config/bash/bashrc.d/01_tmux.sh" << EOF
|
|
||||||
if command -v tmux 1>/dev/null && [[ -z "\$TMUX" ]] && [[ ! "\$TERM" =~ tmux ]]; then
|
|
||||||
exec tmux new
|
|
||||||
fi
|
|
||||||
EOF
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
echo "apt install termux-api tsu"
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
#!/usr/bin/env zsh
|
|
||||||
|
|
||||||
for zfile in .zshenv .config/zsh/.zshrc .config/zsh/.zprofile .config/zsh/.zlogout .config/zsh/aliases .config/zsh/completion .config/zsh/history .config/zsh/options .config/zsh/other .config/zsh/plugin .config/zsh/prompt .config/zsh/sourcer; do
|
|
||||||
zcompile "$HOME/$zfile"
|
|
||||||
done
|
|
||||||
Loading…
x
Reference in New Issue
Block a user