dotfiles/bin/helpers/functions.sh
Menno van Leeuwen 819fb027bf
feat: adds keyboard shortcut support
feat: adds wezterm
feat: adds cargo, flatpak and apt
2024-08-22 22:44:20 +02:00

184 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env zsh
#Color print function, usage: println "message" "color"
println() {
color=$2
printfe "%s\n" $color "$1"
}
logo() {
tput setaf 2
cat ~/dotfiles/bin/resources/logo.txt
println " " "cyan"
tput sgr0
continue_eitherway=$1
# Print if repo is dirty and the count of untracked files, modified files and staged files
if [[ $(git -C ~/dotfiles status --porcelain) ]]; then
printfe "%s" "yellow" "dotfiles repo is dirty "
printfe "%s" "red" "[$(git -C ~/dotfiles status --porcelain | grep -c '^??')] untracked "
printfe "%s" "yellow" "[$(git -C ~/dotfiles status --porcelain | grep -c '^ M')] modified "
printfe "%s" "green" "[$(git -C ~/dotfiles status --porcelain | grep -c '^M ')] staged "
fi
printfe "%s" "blue" "[$(git -C ~/dotfiles rev-parse --short HEAD)] "
if [[ $(git -C ~/dotfiles log origin/master..HEAD) ]]; then
printfe "%s" "yellow" "[!] You have $(git -C ~/dotfiles log origin/master..HEAD --oneline | wc -l | tr -d ' ') commit(s) to push"
fi
println "" "normal"
if [[ $continue_eitherway == "continue" ]]; then
return
fi
if [[ $(git -C ~/dotfiles status --porcelain) ]]; then
# Continue?
printfe "%s" "red" "Continue anyway? [y/N] "
read -k 1
if [[ $REPLY != "y" ]]; then
println "" "normal"
exit 0
fi
println "" "normal"
println "" "normal"
fi
}
# print colored with printf (args: format, color, message ...)
printfe() {
format=$1
color=$2
shift 2
red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
blue=$(tput setaf 4)
magenta=$(tput setaf 5)
cyan=$(tput setaf 6)
normal=$(tput sgr0)
case $color in
"red")
color=$red
;;
"green")
color=$green
;;
"yellow")
color=$yellow
;;
"blue")
color=$blue
;;
"magenta")
color=$magenta
;;
"cyan")
color=$cyan
;;
*)
color=$normal
;;
esac
printf "$color$format$normal" "$@"
}
ensure_package_installed() {
if ! command -v $1 &>/dev/null; then
println "$1 is not installed. Please install it." "red"
exit 1
fi
println " - $1 is available." "green"
}
ask_before_do() {
printfe "%s" "yellow" "Trying to run: "
printfe "%s" "cyan" "'$@' "
read -p "Continue? [y/N]: " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
return
fi
printfe "%s" "cyan" "Running '"
printfe "%s" "yellow" "$@"
println "'..." "cyan"
# In case DRY_RUN is set to true we should just print the command and not run it
if [ "$DRY_RUN" = true ]; then
println "Would have run '$@'" "yellow"
return
else
$@
fi
}
ensure_sudo_privileges() {
if sudo -n true 2>/dev/null; then
return
else
println "$1" "yellow"
sudo true
fi
}
ask_before_do_multi() {
if [ "$DRY_RUN" = true ]; then
println "Would have run: $1" "yellow"
else
read -p "$1 (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
return false
fi
return true
fi
}
add_to_hosts() {
local domain=$1
local ip="127.0.0.1"
# Check if domain already exists in /etc/hosts
if ! grep -q "$domain" /etc/hosts; then
println " - adding $domain to /etc/hosts" "yellow"
echo "$ip $domain" | sudo tee -a /etc/hosts >/dev/null
else
println " - $domain already exists in /etc/hosts" "green"
fi
}
# Function to check if $1 is a path to a symlink, if not it will make a symlink to $2
# In case there's a file at the location of the symlink, it will backup the file
# Parameters
# $1: file to check
# $2: link location
check_or_make_symlink() {
if [ ! -L $1 ]; then
if [ -f $1 ]; then
mv $1 $1.bak
printfe "%s\n" "yellow" " - Backed up $1 to $1.bak"
fi
mkdir -p $(dirname $1)
ln -s $2 $1
printfe "%s\n" "green" " - Created symlink $1 -> $2"
fi
# Confirm the symlink that already exists point to the correct location
if [ -L $1 ]; then
if [ "$(readlink $1)" != $2 ]; then
printfe "%s\n" "yellow" " - Symlink $1 exists but points to the wrong location"
printfe "%s\n" "yellow" " Expected: $2"
printfe "%s\n" "yellow" " Actual: $(readlink $1)"
printfe "%s\n" "yellow" " Fixing symlink"
rm $1
mkdir -p $(dirname $1)
ln -s $2 $1
printfe "%s\n" "green" " Created symlink $1 -> $2"
fi
fi
}