199 lines
5.0 KiB
Bash
Executable File
199 lines
5.0 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 $HOME/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 $2 -> $1"
|
|
return
|
|
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 $2 -> $1"
|
|
return
|
|
fi
|
|
fi
|
|
|
|
if [ ! -L $1 ]; then
|
|
printfe "%s\n" "red" " - Failed to create symlink $2 -> $1"
|
|
return
|
|
fi
|
|
|
|
printfe "%s" "green" " - OK: "
|
|
printfe "%-30s" "blue" "$1"
|
|
printfe "%s" "cyan" " -> "
|
|
printfe "%-30s\n" "blue" "$2"
|
|
}
|
|
|
|
clear_line() {
|
|
echo -en "\r"
|
|
} |